- 使用 Python 类型注释的数据验证和设置管理
- Pydantic 在运行时强制执行类型提示,并在数据无效时提供用户友好的错误
- 如何在纯粹的、规范的 Python 中定义数据,并使用 Pydantic 进行验证
1. 示例
```python from datetime import datetime from typing import List, Optional from pydantic import BaseModel
class User(BaseModel): id: int name = ‘John Doe’ signup_ts: Optional[datetime] = None friends: List[int] = []
external_data = { ‘id’: ‘123’, ‘signup_ts’: ‘2019-06-01 12:22’, ‘friends’: [1, 2, ‘3’], } user = User(**external_data) print(user.id)
> 123
print(repr(user.signup_ts))
> datetime.datetime(2019, 6, 1, 12, 22)
print(user.friends)
> [1, 2, 3]
print(user.dict()) “”” { ‘id’: 123, ‘signup_ts’: datetime.datetime(2019, 6, 1, 12, 22), ‘friends’: [1, 2, 3], ‘name’: ‘John Doe’, } “””
上面代码发生了什么:
- `id`:该字段定义为`int` 类型,这里的注解声明仅仅是为了告诉 Pydantic 该字段是必需的。如果可能,`Strings`、`bytes`、`floats`将被强制转换为整数,否则将引发异常
- `name`:从提供的默认值推断为 `String` 类型,因为它有一个默认值,所以它不是必需的
- `signup_ts`:是一个非必需的日期字段(如果未提供值时则取值为 `None`),Pydantic 将处理 `int` 类型的 UNIX 时间戳(例如 1496498400)或者表示日期和时间的字符串
- `friends`:使用 Python 的 `typing` 库,并且需要一个整数列表。与 `id `一样,类似整数的对象将被转换为整数。
如果 Pydantic 验证失败将引发错误,我们可以查看其详细错误说明:
```python
from pydantic import ValidationError
try:
User(signup_ts='broken', friends=[1, 2, 'not number'])
except ValidationError as e:
print(e.json())
[
{
"loc": [
"id"
],
"msg": "field required",
"type": "value_error.missing"
},
{
"loc": [
"signup_ts"
],
"msg": "invalid datetime format",
"type": "value_error.datetime"
},
{
"loc": [
"friends",
2
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
2. 基本原理
显然 Pydantic 使用了一些非常酷的新语言特性,但我如何要在实际工作中使用它呢?
2.1 与IDE兼容性良好
无需学习新的微语言模式定义。如果你知道如何使用 Python 类型提示,你就会知道如何使用 Pydantic。数据结构只是您使用类型注释定义的类实例,因此自动补全、linting、mypy、IDE(尤其是 PyCharm),并且验证后的数据能够使我们想法更好地正确工作。
2.2 双重使用
Pydantic 的 BaseSettings
类允许在“验证此请求数据”上下问和“加载我的系统设置”上下文中使用 Pydantic。主要区别在于可以从环境变量中读取系统设置,并且通常需要更复杂的对象,例如 DSN 和 Python 对象。
2.3 快速
Pydantic 一直非常重视性能,大多数库都是用 Cython 编译的,加速了约 50%,它通常与大多数类似库一样快甚至更快。
2.4 验证复杂的结构
递归使用 Pydantic 模型、typing
的标准类型(例如 List
、Tuple
、Dict
等)和验证器,允许我们清晰地、轻松地定义、验证个解析复杂的数据模式。
2.5 扩展性
Pydantic 允许定义自定义数据类型,或者我们可以在模型上使用验证装饰器来扩展验证。
2.6 集成dataclass
与 BaseModel
一样,Pydantic 提供了一个 dataclass
装饰器,使用它几乎可以创建任何带有输入数据接卸和验证的 Python 数据类。
3. 使用 Pydantic
3.1 FastAPI
基于 Pydantic 和 Starlette 的高性能 API 框架,易于学习、编码速度快、可用于生产。
3.2 Jupyter
Jupyter Notebbook 的开发人员正在使用 Pydantic 进行子项目,通过基于 FastAPI 的 Jupyter 服务器 Jypyverse,以及 FPS 的配置管理。