🚀 原文地址:https://pydantic-docs.helpmanual.io/

  • 使用 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’, } “””

  1. 上面代码发生了什么:
  2. - `id`:该字段定义为`int` 类型,这里的注解声明仅仅是为了告诉 Pydantic 该字段是必需的。如果可能,`Strings``bytes``floats`将被强制转换为整数,否则将引发异常
  3. - `name`:从提供的默认值推断为 `String` 类型,因为它有一个默认值,所以它不是必需的
  4. - `signup_ts`:是一个非必需的日期字段(如果未提供值时则取值为 `None`),Pydantic 将处理 `int` 类型的 UNIX 时间戳(例如 1496498400)或者表示日期和时间的字符串
  5. - `friends`:使用 Python `typing` 库,并且需要一个整数列表。与 `id `一样,类似整数的对象将被转换为整数。
  6. 如果 Pydantic 验证失败将引发错误,我们可以查看其详细错误说明:
  7. ```python
  8. from pydantic import ValidationError
  9. try:
  10. User(signup_ts='broken', friends=[1, 2, 'not number'])
  11. except ValidationError as e:
  12. print(e.json())
  1. [
  2. {
  3. "loc": [
  4. "id"
  5. ],
  6. "msg": "field required",
  7. "type": "value_error.missing"
  8. },
  9. {
  10. "loc": [
  11. "signup_ts"
  12. ],
  13. "msg": "invalid datetime format",
  14. "type": "value_error.datetime"
  15. },
  16. {
  17. "loc": [
  18. "friends",
  19. 2
  20. ],
  21. "msg": "value is not a valid integer",
  22. "type": "type_error.integer"
  23. }
  24. ]

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 的标准类型(例如 ListTupleDict 等)和验证器,允许我们清晰地、轻松地定义、验证个解析复杂的数据模式。

2.5 扩展性

Pydantic 允许定义自定义数据类型,或者我们可以在模型上使用验证装饰器来扩展验证。

2.6 集成dataclass

BaseModel 一样,Pydantic 提供了一个 dataclass 装饰器,使用它几乎可以创建任何带有输入数据接卸和验证的 Python 数据类。

3. 使用 Pydantic

数百个组织和软件包都在使用 Pydantic,包括:

3.1 FastAPI

基于 Pydantic 和 Starlette 的高性能 API 框架,易于学习、编码速度快、可用于生产。

3.2 Jupyter

Jupyter Notebbook 的开发人员正在使用 Pydantic 进行子项目,通过基于 FastAPI 的 Jupyter 服务器 Jypyverse,以及 FPS 的配置管理。

3.3 Microsoft

3.4 Amazon Web Services

3.5 NSA

3.6 Uber

3.7 Cuenca

3.8 分子科学软件研究所

3.9 Reach

3.10 Robusta.dev

4. Pydantic讨论