跳转到内容

Pydantic

CI Coverage
pypi CondaForge downloads
license llms.txt

版本文档: v2.11.1

Pydantic 是 Python 中使用最广泛的数据验证库。

快速且可扩展,Pydantic 与您的代码检查器/IDE/大脑配合良好。使用纯粹、规范的 Python 3.9+ 定义数据应有的形式;使用 Pydantic 验证它。

使用 Logfire 监控 Pydantic 🔥

Logfire 由与 Pydantic 相同的团队构建,是一个应用程序监控工具,它像 Pydantic 本身一样简单易用且功能强大。

Logfire 与许多流行的 Python 库集成,包括 FastAPI、OpenAI 和 Pydantic 本身,因此您可以使用 Logfire 监控 Pydantic 验证并了解为什么某些输入验证失败

使用 Logfire 监控 Pydantic
from datetime import datetime

import logfire

from pydantic import BaseModel

logfire.configure()
logfire.instrument_pydantic()  


class Delivery(BaseModel):
    timestamp: datetime
    dimensions: tuple[int, int]


# this will record details of a successful validation to logfire
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)

Delivery(timestamp='2020-01-02T03:04:05Z', dimensions=['10'])  

将在 Logfire 平台中为您提供这样的视图

Logfire Pydantic Integration

这只是一个玩具示例,但希望能够清楚地说明检测更复杂应用程序的潜在价值。

了解更多关于 Pydantic Logfire 的信息

为什么使用 Pydantic?

  • 由类型提示驱动 — 借助 Pydantic,模式验证和序列化由类型注解控制;更少学习,更少代码编写,并与您的 IDE 和静态分析工具集成。 了解更多…
  • 速度 — Pydantic 的核心验证逻辑是用 Rust 编写的。因此,Pydantic 是 Python 中最快的数据验证库之一。 了解更多…
  • JSON 模式 — Pydantic 模型可以发出 JSON 模式,从而可以轻松与其他工具集成。 了解更多…
  • 严格宽松模式 — Pydantic 可以在严格模式(不转换数据)或宽松模式下运行,在宽松模式下,Pydantic 会尝试在适当的情况下将数据强制转换为正确的类型。 了解更多…
  • 数据类TypedDicts 等 — Pydantic 支持验证许多标准库类型,包括 dataclassTypedDict了解更多…
  • 自定义 — Pydantic 允许自定义验证器和序列化器以多种强大的方式更改数据处理方式。 了解更多…
  • 生态系统 — PyPI 上大约有 8,000 个软件包使用 Pydantic,包括非常流行的库,如 FastAPIhuggingfaceDjango NinjaSQLModelLangChain了解更多…
  • 经过实战检验 — Pydantic 每月下载量超过 7000 万次,并被所有 FAANG 公司和纳斯达克 25 家最大公司中的 20 家使用。如果您尝试使用 Pydantic 做某事,其他人可能已经做过了。 了解更多…

安装 Pydantic 非常简单:pip install pydantic

Pydantic 示例

要了解 Pydantic 的工作原理,让我们从一个简单的示例开始,创建一个继承自 BaseModel 的自定义类

验证成功
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},
}
"""

如果验证失败,Pydantic 将引发错误,并详细说明错误原因

验证错误
# continuing the above example...

from datetime import datetime
from pydantic import BaseModel, PositiveInt, 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。世界各地一些著名的公司和组织正在使用 Pydantic,包括

有关使用 Pydantic 的更多开源项目的综合列表,请参阅 github 上的依赖项列表,或者您可以在 awesome-pydantic 中找到一些使用 Pydantic 的优秀项目。

此页是否对您有帮助?