pydantic v2+ 的 basemodel 默认启用运行时类型检查,而原生 class 或 @dataclass 仅支持静态类型提示(如 mypy),解释器忽略注解,不执行校验;必须显式使用 basemodel 或 @pydantic.dataclass 才能触发初始化和赋值时的动态验证。

Pydantic v2+ 的 BaseModel 默认已强制类型检查,但原生 Python 类(class)不支持——不能靠 Type Hints 自动校验,必须借助 pydantic 或其他运行时机制。
为什么 @dataclass + Type Hints 不会做运行时类型检查
Type Hints 本质是注解,仅用于静态分析(如 mypy),Python 解释器完全忽略它们。哪怕你写 age: int,传入 "25" 也不会报错。
-
@dataclass只生成__init__和__repr__等方法,不插入类型校验逻辑 - mypy 能发现错误,但运行时照常执行,
obj.age = "wrong"不会抛异常 - 想在赋值/初始化时拦住非法值,必须有运行时钩子(如
__set__、__setattr__或 pydantic 的模型验证层)
用 pydantic.BaseModel 替代原生 class 实现自动类型检查
这是最直接、最可靠的方式:把类定义成 BaseModel 子类,所有字段声明即启用校验。
- 初始化时校验:
User(name="Alice", age="25")→ 报ValidationError,因为age声明为int - 赋值时也校验:
user.age = "25"同样触发错误(需开启validate_assignment=True) - 支持嵌套模型、默认值、
Field(...)必填、Field(default_factory=list)等
示例:
from pydantic import BaseModel <p>class User(BaseModel): name: str age: int</p><p>user = User(name="Bob", age=30) # ✅ OK user = User(name="Bob", age="30") # ❌ ValidationError: Input should be a valid integer</p>
想保留原生 class?用 pydantic.dataclasses 代替 @dataclass
如果你已有大量 @dataclass 代码,又想加运行时校验,不要手写 descriptor 或重载 __setattr__——直接换用 @pydantic.dataclass。
- 接口几乎兼容标准
@dataclass,但会在初始化和赋值时做类型校验 - 支持
config参数(如extra="forbid")、Field配置 - 注意:它不是装饰
dataclass,而是独立实现;导入路径是from pydantic import dataclasses,调用@dataclasses.dataclass - 性能略低于原生
@dataclass,但远好于手动实现校验逻辑
示例:
from pydantic import dataclasses <p>@dataclasses.dataclass class Product: title: str price: float</p><p>p = Product(title="Laptop", price="999.99") # ❌ ValidationError: Input should be a valid number</p>
别踩这些坑
常见误操作会绕过校验或引发意外行为:
- 没加
validate_assignment=True就以为属性赋值会被检查——默认关闭,user.age = "abc"完全静默成功 - 字段类型写成
Optional[str]却忘了允许None,结果user.name = None报错(除非显式用Field(default=None)或设default=None) - 用
dict初始化BaseModel时,键名拼错或类型不匹配,错误信息可能不够直白(比如提示 “field required”,实际是字段名大小写不对) - 继承
BaseModel时,父类字段若未标注类型(如id = None),pydantic 会忽略该字段,不参与校验也不序列化
类型检查不是加了 Type Hints 就自动生效的魔法,pydantic 是目前 Python 生态里最成熟、文档最清晰、错误反馈最友好的运行时校验方案——但得按它的规则来,漏掉一个配置项,校验就形同虚设。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











