🚀 Pydantic 2.x 使用指南:高性能的数据验证与模型构建

753 阅读4分钟

🚀 Pydantic 2.x 使用指南:高性能的数据验证与模型构建

在现代 Python 开发中,尤其是涉及 FastAPI、LangChain、配置管理和大型系统构建时,数据模型的验证和结构化显得尤为关键。Pydantic 是一个用于数据建模和验证的强大库,其 2.x 版本在性能与可扩展性上有显著提升。


📌 一、Pydantic 是什么?

Pydantic 是一个基于 Python 类型提示的数据验证和设置管理工具库,它允许你使用类似数据类(dataclass)的方式来定义模型,并在初始化时自动进行类型转换与验证。

✨ 特性包括:

  • 🔍 基于标准 Python 类型注解;

  • 🔄 自动类型转换与错误提示;

  • 🧩 支持嵌套模型与复杂校验逻辑;

  • ⚙️ 支持读取环境变量配置(BaseSettings);

  • ⚡ Pydantic 2.x 内核部分用 Rust 重写,性能更强。


🧭 二、快速上手 Pydantic 2.x

📦 安装

pip install pydantic
pip install pydantic-settings  # 如果需要环境变量支持

🛠️ 三、基础用法

✅ 1. 定义一个模型

from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    is_active: bool = True

🧪 2. 普通类 vs Pydantic 实例化对比

✅ 普通类:参数必须按要求传入,手动处理类型与校验
class User:
    def __init__(self, id: int, name: str, is_active: bool = True):
        if not isinstance(id, int):
            raise TypeError("id must be int")
        self.id = id
        self.name = name
        self.is_active = is_active

user = User(id=123, name="Alice")
  • ❌ 缺点:类型检查、默认值、转换都需要手动实现。

✅ Pydantic 模型:支持自动校验 + 自动转换
from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    is_active: bool = True

user = User(id="123", name="Alice")  # 自动将 "123" 转为 int
  • 🟢 Pydantic 会:

    • 自动将类型转换(如 str → int);
    • 如果缺少参数,会报错;
    • 如果类型不对,也会报错;
    • 支持 .model_dump() 转为 dict 输出,model_dump_json()转为JSON字符串。

📌 注意:model_dump() 是 v2.x 中替代 .dict() 的方法。

❌ 3. 模型验证失败

User(id='abc', name='Alice')
# ValidationError: Input should be a valid integer

🧱 四、字段验证器与模型验证器

Pydantic 2.x 使用新的装饰器:

  • 🔧 @field_validator:字段级验证

  • 🧠 @model_validator:模型级验证

🔧 1. 字段验证器

作用:在字段被赋值时,对该字段的值进行校验或转换。

🧠 特点:

  • 只作用于指定字段;
  • 可以单字段校验,也可以多字段复用一个校验函数;
  • 校验发生在数据解析阶段(先于模型校验器执行);
  • 使用 @classmethod 定义;
  • 可以链式写多个校验器。
from pydantic import BaseModel, field_validator

class User(BaseModel):
    age: int

    @field_validator('age')
    @classmethod
    def age_must_be_positive(cls, v):
        if v <= 0:
            raise ValueError('年龄必须为正数')
        return v

🧠 2. 模型验证器(如联合字段校验)

作用:在所有字段校验完成后,对整个模型的多个字段组合进行验证或处理(如字段之间的逻辑关系)。

🧠 特点:

  • 可用于跨字段验证;
  • 默认运行在 校验之后,通过 mode='after' 指定;
  • 也可以用 mode='before' 在字段校验之前运行(高级场景);
  • 支持返回整个 cls(模型)或修改字段值。
from pydantic import BaseModel, model_validator

class User(BaseModel):
    password: str
    confirm_password: str

    @model_validator(mode='after')
    def check_passwords_match(self):
        if self.password != self.confirm_password:
            raise ValueError('密码不一致')
        return self

🏗️ 五、嵌套模型

class Address(BaseModel):
    city: str
    zipcode: str

class User(BaseModel):
    name: str
    address: Address

user = User(name="Tom", address={"city": "Beijing", "zipcode": "100000"})

⚙️ 六、使用BaseSettings管理配置(环境变量支持)

Pydantic 提供 BaseSettings 类来读取 .env 文件或环境变量,非常适用于微服务、LLM 等配置项管理。

from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    api_key: str
    debug: bool = False

    class Config:
        env_file = ".env"

settings = Settings()
print(settings.api_key)

📄 .env 文件示例:

API_KEY=abcd1234
DEBUG=true

⚖️ 七、与 dataclass 的区别

功能dataclassPydantic BaseModel
✅ 类型验证❌ 无✅ 有
🔄 类型转换❌ 无✅ 自动转换
✅ 默认值校验❌ 需手动实现✅ 内置支持
🌍 环境变量读取❌ 无✅ 支持
⚡ 性能(2.x)一般✅ 高性能 Rust 加速

🧩 八、Field 的基本作用

参数名类型/含义说明
default任意类型设置字段默认值
default_factoryCallable[[], T]设置字段的动态默认值(如生成时间、UUID)
aliasstr设置字段的别名,用于 JSON 或输入解析
titlestr标题,用于 JSON Schema
descriptionstr字段描述,常用于自动 API 文档
exampleslist示例值列表(配合 API 文档使用)
gt, ge, lt, leint/float数值限制:大于、≥、小于、≤
min_lengthint限制字符串/列表最小长度
max_lengthint限制字符串/列表最大长度
patternstr正则表达式匹配字符串
constbool值必须为默认值
json_schema_extradict自定义 JSON Schema 元数据
excludebool是否在 .model_dump() 时排除该字段
validate_defaultbool是否对默认值进行验证(v2 专属)
frozenbool是否将字段设为只读

📚 九、参考资源