前言
Pydantic 是一个用于数据验证和设置管理的 Python 库。它通过使用 Python 类型注解(type hints),提供了简单而高效的数据验证机制。Pydantic 的核心组件是 BaseModel 类,通过继承这个类,我们可以定义具有数据验证和序列化功能的模型。
定义基本模型
Pydantic 使用 BaseModel 类作为所有模型的基类。通过继承 BaseModel,我们可以定义一个数据模型。以下是一个简单的示例:
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str
age: int
email: str
在这个例子中,我们定义了一个 User 模型,包含 id
、name
、age
和 email
四个字段,每个字段都有明确的类型注解。
创建模型实例
我们可以通过传递字典或关键字参数来创建模型实例。Pydantic 会自动验证传入的数据,并在必要时进行类型转换。
user = User(id=1, name='Alice', age=30, email='alice@example.com')
print(user)
如果传入的数据不符合定义的类型,Pydantic 会抛出验证错误。例如,以下代码会引发一个验证错误,因为 age
应该是一个整数:
try:
user = User(id=1, name='Alice', age='thirty', email='alice@example.com')
except ValueError as e:
print(e)
数据验证与错误处理
Pydantic 提供了详细的错误信息,帮助我们快速定位问题。我们可以通过捕获 ValidationError 异常来处理这些错误。
from pydantic import ValidationError
data = {'id': 1, 'name': 'Alice', 'age': 'thirty', 'email': 'alice@example.com'}
try:
user = User(**data)
except ValidationError as e:
print(e.json())
上述代码会输出验证错误的详细信息,包括哪个字段验证失败以及失败的原因。
默认值与可选字段
在定义模型时,我们可以为字段设置默认值,或将字段设为可选。使用 Optional 类型注解可以定义可选字段。
from typing import Optional
class User(BaseModel):
id: int
name: str
age: Optional[int] = None
email: str = 'default@example.com'
在这个例子中,age
字段是可选的,默认值为 None
,而 email
字段有一个默认值 'default@example.com'
。
嵌套模型
Pydantic 允许我们在一个模型中嵌套另一个模型,这对于复杂的数据结构非常有用。
class Address(BaseModel):
street: str
city: str
zip_code: str
class User(BaseModel):
id: int
name: str
age: int
email: str
address: Address
address_data = {'street': '123 Main St', 'city': 'New York', 'zip_code': '10001'}
user_data = {'id': 1, 'name': 'Alice', 'age': 30, 'email': 'alice@example.com', 'address': address_data}
user = User(**user_data)
print(user)
在这个例子中,我们定义了一个 Address
模型,并在 User
模型中嵌套了 Address
模型。
数据序列化与反序列化
Pydantic 提供了方便的方法来序列化和反序列化模型实例。例如,我们可以将模型实例转换为字典或 JSON 格式:
user_dict = user.dict()
user_json = user.json()
print(user_dict)
print(user_json)
我们还可以通过解析 JSON 数据来创建模型实例:
json_data = '{"id": 1, "name": "Alice", "age": 30, "email": "alice@example.com", "address": {"street": "123 Main St", "city": "New York", "zip_code": "10001"}}'
user = User.parse_raw(json_data)
print(user)
总结
Pydantic 的BaseModel
提供了强大的数据验证和序列化功能,使得数据处理更加安全和高效。通过定义清晰的类型注解和模型,我们可以轻松地管理和验证复杂的数据结构。