Pydantic:Python 数据验证的事实标准
Pydantic:Python 数据验证的事实标准
pydantic 在 GitHub 上已经拿到 27.9K Star 了。
它只做一件事:用 Python 原生的类型注解来做数据验证。传入的数据对不对、类型是否匹配、缺没缺字段,全部自动检查并转换。

1、 这玩意儿是干嘛的
写 Python 接口或数据处理脚本时,最烦的不是业务逻辑,是输入校验。
用户传了个字符串代替数字,日期格式五花八门,列表里混进一个 None,这些问题要么在运行时报错,要么悄悄埋进数据里,等出事了才暴露。
Pydantic 的做法很直接:定义一个继承自 BaseModel 的类,把字段类型写清楚,剩下的交给它。
from datetime import datetime
from typing import Optional
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str = 'John Doe'
signup_ts: Optional[datetime] = None
friends: list[int] = []
外部数据丢进来,它会自动尝试转换。字符串 “123” 变成整数 123,ISO 格式的时间字符串转成 datetime 对象,字节串也能正常解析。类型对不上或者转换不了,直接抛出 ValidationError,错误信息很具体,告诉你哪个字段出了什么问题。
2、 为什么要用它
Python 本身有 typing,但没有运行时的强制校验。你写了 id: int,运行的时候传个字符串进来,Python 不会拦你。
手动写校验逻辑又太啰嗦。每个字段判断类型、检查范围、处理默认值,写多了全是样板代码。
Pydantic 把这一层全包掉了。声明式定义,自动验证,错误信息开箱即用。和 IDE、类型检查器也能配合得很好,写代码的时候就有补全和提示。
另一个点是性能。Pydantic V2 用 Rust 重写了核心验证逻辑,速度比 V1 快很多。对高并发的 API 服务来说,这一点差异很实在。

3、 安装与使用
安装很简单:
pip install -U pydantic
也可以用 conda:
conda install pydantic -c conda-forge
基础用法就是定义模型、实例化、验证:
from datetime import datetime
from typing import Optional
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str = 'John Doe'
signup_ts: Optional[datetime] = None
friends: list[int] = []
external_data = {
'id': '123',
'signup_ts': '2017-06-01 12:22',
'friends': [1, '2', b'3']
}
user = User(**external_data)
print(user)
#> User id=123 name='John Doe' signup_ts=datetime.datetime(2017, 6, 1, 12, 22) friends=[1, 2, 3]
注意这里 id 传的是字符串 “123”,但声明的是 int,Pydantic 会自动转换。friends 里混了整数、字符串、字节串,最后都统一转成整数列表。这种自动 coercion 是它最省心的地方。
4、 适合哪些人用
- 写 FastAPI 或类似框架的人,Pydantic 是 FastAPI 的请求/响应模型底层
- 做数据管道、ETL 流程,需要批量校验和清洗结构化数据
- 任何不想在数据校验上写重复代码的 Python 开发者
要求 Python 3.10 以上。如果你还在用老版本,建议先升级。
TL 流程,需要批量校验和清洗结构化数据
- 任何不想在数据校验上写重复代码的 Python 开发者
要求 Python 3.10 以上。如果你还在用老版本,建议先升级。
更多推荐


所有评论(0)