You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:24:06