DataClass
DataClass 是 Python 3.7 引入的一个装饰器,用于简化创建类的方法
它自动生成一些常用的特殊方法,比如 __init__()
、__repr__()
、__eq__()
等。
主要用处:
减少样板代码:不需要手动编写初始化方法等。
更清晰的类定义:通过注解定义属性,更清晰地展示类的结构。
自动生成特殊方法:如
__init__()
、__repr__()
和__eq__()
。
import inspect
import dataclasses
@dataclasses.dataclass(frozen=True, order=True)
class Person:
"""
在我们使用字典传递信息的时候,可以尝试使用数据类的方式,保证数据传递正确
也可以使用Pydantic的方式
"""
name: str
age: int
city: str
zheng = Person(name="zheng", age=18, city="Beijing")
print(zheng.name)
print(zheng)
# 以字典形式打印
print(dataclasses.asdict(zheng))
# 查看当前类中有哪些方法
print(inspect.getmembers(Person, predicate=inspect.isfunction))
Pydantic
Pydantic 是一个数据验证和设置管理的库。
基于 Python 类型注解,通过提供数据验证、解析和复杂模型支持来提升数据处理的安全性和可维护性。
主要用处:
数据验证:在模型初始化时自动验证数据类型和格式。
数据解析:支持复杂的数据结构和嵌套模型。
自动转换:能够根据类型注解自动转换输入数据类型。
from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel, ValidationError
def print_red(text):
"""用红色显示字体的方法"""
print("\033[31m {}\033[0m".format(text))
print_red("Pydantic限制类型")
class Student(BaseModel):
"""
用户类,使用Pydantic限制类型
"""
id: int
name: str
signup_ts: datetime
last_login_ts: Optional[datetime] = None
friends: List[int] = []
student = Student(id=1, name="John", signup_ts=datetime.now())
print(student.signup_ts)
Type Hint
Type Hint 是 Python 3.5 引入的特性。
通过为函数、变量和类属性提供类型注解,帮助开发者和 IDE 更好地理解代码的预期行为。
主要用处:
提高代码可读性:明确函数参数和返回值的类型。
增强静态分析:借助类型检查工具(如
mypy
)进行静态类型检查。改进自动补全和文档生成:让 IDE 提供更好的代码提示和文档生成支持。
推广的工程优点:
几乎没有 run time 惩罚,就是不会导致项目运行变慢
渐进式的类型标注,就是可以一点一点的修改整个项目中的代码,写了type hint 就检查,没写就不检查
feature:
def func(a: int, b: int) -> int:
"""返回a+b的结果"""
return a + b
class A:
name = "A"
def get_name(a: A) -> str:
return a.name
class Node:
"""
双向链表==> 这里传递参数是Node自身
但是在传入的时候,这个Node还没有被创建出来,就无法直接使用Node
所以这里添加双引号,来实现调用
"""
def __init__(self, prev: "Node"):
self.prev = prev
self.next = None
def my_sum(lst: list[int]) -> int:
"""在list里面指定数据类型"""
key = 0
for i in lst:
key += i
return key
# 对于 list 和 tuple 的情况,使用 Sequence
from typing import Sequence
def my_sum_2(lst: Sequence[int]) -> int:
"""
在list里面指定数据类型,使用Sequence 就变成 list tuple都可以传递
"""
key = 0
for i in lst:
key += i
return key
# dictionary
def my_sum_3(dicts: dict[str, int]) -> int:
"""在list里面指定数据类型"""
key = 0
for i in dicts.values():
key += i
return key
my_sum_3({"a": 1, "b": 2, "c": 3})
# None ==> Union、|、Optional
from typing import Union
def my_sum_4(key: Union[int, None]) -> Union:
if key is None:
return None
return key
def my_sum_5(key: int | None) -> int:
if key is None:
return 0
return key
from typing import Optional
def my_sum_6(key: Optional[int]) -> int:
if key is None:
return 0
return key
# 对变量进行类型标注
user_list: list[int] = []
user_list.append(1)
print(user_list)
# Any ==> 什么类型都可以,默认就是Any
# 标注函数返回值
# Python中所有没有显示返回的函数,其返回值都是None,我们也要给 -> None
def get_info(user_id:Optional[int]) -> None:
user = user_id
user.save()
from typing import Optional, NoReturn
def get_info(user_id:Optional[int]) -> NoReturn:
raise ValueError
组合
from dataclasses import dataclass
from pydantic import BaseModel, ValidationError
@dataclass
class Point:
x: int
y: int
class User(BaseModel):
id: int
name: str
age: int
def create_user(id: int, name: str, age: int) -> User:
return User(id=id, name=name, age=age)
try:
user = create_user(123, 'Alice', 30)
print(user)
except ValidationError as e:
print(e.json())
评论区