dataclass本身不校验,需配合__post_init__或pydantic实现:前者适合轻量规则校验,后者支持强类型、默认值、嵌套等完整能力。

Python 中用 dataclass 做数据校验,核心不是它本身——@dataclass 默认不校验,得靠类型提示 + 第三方库(比如 pydantic)或手动加 __post_init__。但它是构建可校验模型的绝佳起点:结构清晰、字段明确、初始化自动,天然适配校验逻辑。
用 @dataclass 定义基础结构
先写一个干净的数据容器,明确字段名和类型:
from dataclasses import dataclass@dataclass class User: name: str age: int email: str
这样就自动生成了 __init__、__repr__ 和 __eq__。但注意:此时传入 age="abc" 不会报错,因为 Python 运行时不检查类型。
加类型校验:用 __post_init__ 手动把关
在实例创建后立刻验证字段值,适合轻量级业务规则:
立即学习“Python免费学习笔记(深入)”;
- 检查
age是否为正整数 - 确认
email包含@ - 对空字符串或
None提前拦截
示例:
@dataclass
class User:
name: str
age: int
email: str
def __post_init__(self):
if not isinstance(self.age, int) or self.age < 0:
raise ValueError("age must be a non-negative integer")
if "@" not in self.email:
raise ValueError("email must contain '@'")
if not self.name or not isinstance(self.name, str):
raise ValueError("name must be a non-empty string")
Magic CMS 网站管理系统2.2.1.alpha 政企版
Magic CMS网站管理系统(政企版)采用PHP+Mysql架构,再原CMS系统的基础上精简出适合企业政府客户使用版本,继承了原系统的快捷,高效,灵活,实用的特点,保留了核心功能,系统支持自定义模版(极易整合dede模板)、支持扩展插件,自定义模型等功能,保留了文章模型,视频模型,图集模型,产品模型,能够胜任企业多种建站需求。BUG修复:1.修改了程序安装时部分数据无法正常导入的错误2.修改了程
下载
配合 pydantic 实现强校验(推荐)
如果需要完整类型校验、默认值、嵌套模型、JSON 序列化等能力,直接用 pydantic.BaseModel 更省心。但它底层常和 dataclass 思路一致,且支持 @dataclass 风格写法(v2+):
from pydantic.dataclasses import dataclass
@dataclass
class User:
name: str
age: int
email: str
def __post_init_post_parse__(self):
# 解析后额外校验(类似 __post_init__)
if self.age < 0:
raise ValueError("age cannot be negative")
这时传入 age="25" 会自动转成 int;传入 age=-5 则触发异常。
字段默认值与可选字段处理
校验常涉及“字段是否必填”。用 field(default=...) 或 Optional 明确语义:
-
score: float = 0.0→ 有默认值,不传也不报错 -
tags: list[str] = field(default_factory=list)→ 可变默认值安全写法 -
phone: Optional[str] = None→ 允许为空,校验时需单独判断是否提供
注意:不要用 list 或 dict 直接作默认值,会共享引用。
不复杂但容易忽略:dataclass 是骨架,校验是肌肉;光有类型注解不够,得靠运行时逻辑或专用工具来发力。









