Python数据校验模型教程_dataclass基础用法

7次阅读

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

Python 数据校验模型教程_dataclass 基础用法

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")

配合 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 → 允许为空,校验时需单独判断是否提供

注意:不要用 listdict 直接作默认值,会共享引用。

不复杂但容易忽略:dataclass 是骨架,校验是肌肉;光有类型注解不够,得靠运行时逻辑或专用 工具 来发力。

text=ZqhQzanResources