Python对象构造函数参数类型注解不校验问题,如何实现类型不符时抛异常
Python构造函数入参类型校验实现方案
Python原生的类型注解仅作为静态类型提示使用,运行阶段不会自动执行校验,要实现不符合类型抛出异常的需求,可参考以下几种实现方案:
方案1:原生手动校验(无第三方依赖)
直接在构造方法内通过isinstance()判断参数类型,不符合就主动抛出异常,适合小型项目、不想引入额外依赖的场景:
class Item: def __init__(self, number: int): # 手动校验类型 if not isinstance(number, int): raise TypeError(f"参数number期望为int类型,实际传入类型为{type(number).__name__}") self.number = number # 测试调用 a = Item("ciao") # 执行时直接抛出TypeError
方案2:配合dataclass数据类实现
如果你的类是数据类,可在__post_init__钩子方法中统一做校验,不用修改默认的构造逻辑:
from dataclasses import dataclass @dataclass class Item: number: int def __post_init__(self): if not isinstance(self.number, int): raise TypeError(f"参数number期望为int类型,实际传入类型为{type(self.number).__name__}") a = Item("ciao") # 实例化时抛出异常
方案3:使用Pydantic自动校验(推荐中大型项目使用)
Pydantic是Python生态中常用的类型校验库,可自动读取类型注解完成校验,无需手动写判断逻辑,还支持复杂类型、自定义校验规则等能力:
首先安装依赖:pip install pydantic
示例代码:
from pydantic import BaseModel, ValidationError class Item(BaseModel): number: int try: a = Item(number="ciao") except ValidationError as e: print(e)
如果需要严格禁止自动类型转换(比如传入字符串格式的数字"123"也判定为不合法),可以使用StrictInt代替int作为类型注解。
内容的提问来源于stack exchange,提问作者user16488173
相关产品推荐
相关产品推荐

