Pydantic 是目前最广泛使用的 Python 数据验证库之一。它不仅快速且可扩展,还能与各种静态分析工具(如 MyPy、Pyright)和 IDE 良好配合。通过纯正的 Python 3.8+语法定义数据模型,并使用 Pydantic 进行验证。
首先,我们来看一个简单的 Pydantic 示例,创建一个继承自BaseModel
的自定义类:
from datetime import datetime
from typing import Tuple
from pydantic import BaseModel
class Delivery(BaseModel):
timestamp: datetime
dimensions: Tuple[int, int]
m = Delivery(timestamp='2020-01-02T03:04:05Z', dimensions=['10', '20'])
print(repr(m.timestamp))
#> datetime.datetime(2020, 1, 2, 3, 4, 5, tzinfo=TzInfo(UTC))
print(m.dimensions)
#> (10, 20)
上面的代码展示了如何使用 Pydantic 来定义数据模型并进行数据验证。我们定义了一个Delivery
类,该类包含timestamp
和dimensions
两个字段,Pydantic 会自动将输入的数据转换为合适的类型并进行验证。
strict=True
模式(数据不被转换)和strict=False
模式(Pydantic 尝试将数据转换为正确类型)之间切换。dataclass
和TypedDict
。安装 Pydantic 非常简单:
让我们来看另一个例子,创建一个自定义类并进行数据验证:
from datetime import datetime
from pydantic import BaseModel, PositiveInt
class User(BaseModel):
id: int
name: str = 'John Doe'
signup_ts: datetime | None
tastes: dict[str, PositiveInt]
external_data = {
'id': 123,
'signup_ts': '2019-06-01 12:22',
'tastes': {
'wine': 9,
b'cheese': 7,
'cabbage': '1',
},
}
user = User(**external_data)
print(user.id)
#> 123
print(user.model_dump())
"""
{
'id': 123,
'name': 'John Doe',
'signup_ts': datetime.datetime(2019, 6, 1, 12, 22),
'tastes': {'wine': 9, 'cheese': 7, 'cabbage': 1},
}
"""
在这个例子中,我们定义了一个User
类,并使用 Pydantic 进行数据验证和转换。
id
是 int
类型;Pydantic 会将字符串、字节或浮点数转换为整数,否则会引发异常。name
是字符串类型;因为有默认值,所以不是必需的。signup_ts
是 datetime
类型的字段,可以为 None
。tastes
是一个键为字符串,值为正整数的字典。如果验证失败,Pydantic 会引发一个包含错误详细信息的异常:
from pydantic import ValidationError
class User(BaseModel):
id: int
name: str = 'John Doe'
signup_ts: datetime | None
tastes: dict[str, PositiveInt]
external_data = {'id': 'not an int', 'tastes': {}}
try:
User(**external_data)
except ValidationError as e:
print(e.errors())
"""
[
{
'type': 'int_parsing',
'loc': ('id',),
'msg': 'Input should be a valid integer, unable to parse string as an integer',
'input': 'not an int',
'url': 'https://errors.pydantic.dev/2/v/int_parsing',
},
{
'type': 'missing',
'loc': ('signup_ts',),
'msg': 'Field required',
'input': {'id': 'not an int', 'tastes': {}},
'url': 'https://errors.pydantic.dev/2/v/missing',
},
]
"""
以上代码演示了在输入数据无效时,Pydantic 如何提供详细的错误信息。
Pydantic 是一个功能强大且灵活的 Python 数据验证库,它利用类型注解来简化代码编写,并通过高效的 Rust 核心实现了卓越的性能。无论是数据验证、类型转换还是与其他工具的集成,Pydantic 都提供了全面且易用的解决方案。
要了解更多关于 Pydantic 的信息和示例,可以访问Pydantic 的官方文档。