Pydantic 的 BaseModel
Pydantic 是一个数据验证和设置管理的库,它使用 Python 类型注释来定义数据模型的结构。在 Pydantic 中,BaseModel
是所有模型的基类,提供了类型检查、数据转换和验证等功能。下面是一个简单的例子:
python
from pydantic import BaseModel, validator
class User(BaseModel):
id: int
name: str
age: int
# 定义一个类装饰器来校验age字段
@validator('age')
def check_age(cls, value):
if value <= 0:
raise ValueError('年龄必须大于0')
return value
# 使用 User 类来创建一个实例,并自动进行数据验证
user = User(id=123, name="Alice", age=30) # 正确,因为年龄大于0
try:
user = User(id=124, name="Bob", age=0) # 将抛出 ValueError,因为年龄不大于0
except ValueError as e:
print(e)
在这个例子中,@validator('age')
装饰器告诉Pydantic,check_age
方法应该用来校验age
字段。如果age
的值不满足条件(即小于或等于0),校验器将抛出一个ValueError
异常,并显示一条错误信息。
当尝试创建一个age
字段值不符合要求的User
实例时,Pydantic会抛出一个异常,在上面的代码中这个异常被捕获并打印了出来。
Python 的 dataclasses
Python 的 dataclasses
模块提供了一个装饰器和函数来自动添加特殊方法,如 __init__()
和 __repr__()
,到用户定义的类中,它用于创建数据类。这是 Python 3.7+ 版本的新特性。下面是一个使用 dataclasses
的例子:
python
from dataclasses import dataclass
@dataclass
class User:
id: int
name: str
age: int
# 使用 User 类来创建一个实例
user = User(id=123, name="Alice", age=30)
在这个例子中,User
类被 dataclass
装饰器装饰,这导致自动生成了 __init__()
、__repr__()
等方法。但是,与 Pydantic 不同,dataclasses
不提供数据验证功能。
区别
- 数据验证 :Pydantic 的
BaseModel
提供数据验证,而 Python 的dataclasses
不提供。 - 数据转换 :Pydantic
BaseModel
可以在实例化时将数据自动转换为正确的类型(如果可能),而dataclasses
只是简单地接受所提供的数据。 - 用途 :Pydantic 通常用于数据解析和验证,例如在 API 开发中定义请求和响应模型,而
dataclasses
用于简化数据封装,通常在不需要复杂验证和转换的内部代码中使用。
两者都是非常有用的工具,但它们适用于不同的场景。如果需要数据验证和自动类型转换,Pydantic 是一个更好的选择;如果只是想简化类的定义并自动实现一些常见的特殊方法,Python 的 dataclasses
是一个轻量级的解决方案。