如何让dataclasses装饰的类在字段类型赋值不匹配时抛出异常
问题根因
Python 标准库的 dataclasses 模块仅提供类型注解能力,默认不会在运行时执行类型校验,你写的字段类型声明仅供给mypy等静态类型检查工具识别,运行时传入不匹配类型的参数不会被拦截,所以才会出现示例里a为int类型、b为str类型的情况。
解决方案
方案1:无需第三方依赖,手动实现__post_init__校验
dataclass实例初始化完成后会自动调用__post_init__方法,你可以在该方法内手动遍历所有字段做类型校验,适配Python3.9版本:
from dataclasses import dataclass, fields @dataclass class Test: a: str = 'a' b: int = 1 def __post_init__(self): # 遍历所有字段校验类型 for field in fields(self): field_value = getattr(self, field.name) if not isinstance(field_value, field.type): raise TypeError(f"字段 {field.name} 期望类型为 {field.type.__name__},实际传入类型为 {type(field_value).__name__}") # 执行下方代码会直接抛出异常:TypeError: 字段 a 期望类型为 str,实际传入类型为 int t = Test(2, 'b')
方案2:使用pydantic库实现自动校验
如果需要更完善的校验能力(比如嵌套类型、复杂校验规则),可以使用pydantic库,它的dataclass装饰器默认自带运行时类型校验,无需手动写校验逻辑:
- 先安装对应依赖:
pip install pydantic - 代码示例:
# 导入pydantic的dataclass替代标准库实现 from pydantic.dataclasses import dataclass @dataclass class Test: a: str = 'a' b: int = 1 # 执行下方代码会直接抛出ValidationError类型异常 t = Test(2, 'b')
内容的提问来源于stack exchange,提问作者Dinesh Ravi
相关产品推荐
相关产品推荐

