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

如何利用Python type hints在运行时动态校验属性类型,无需重复声明类型规则

完全可以通过自省读取类型注解实现自动校验,不需要重复编写属性判断逻辑,以下是两种可行方案:


方案1:原生Python实现,无需第三方依赖

建议将属性的类型注解声明在类层面,注解会自动存入类的__annotations__字典中,运行时直接读取即可,实现代码如下:

class C:
    # 类层面声明属性类型注解,会自动存入__annotations__字典
    a: int = 0

    def __str__(self):
        return str(self.a)

    @classmethod
    def get(cls,**kwargs):
        c = cls()
        for k,v in kwargs.items():
            # 仅对已声明类型注解的属性做校验
            if k in cls.__annotations__:
                expected_type = cls.__annotations__[k]
                if not isinstance(v, expected_type):
                    raise ValueError(f"属性{k}期望类型为{expected_type.__name__},实际传入类型为{type(v).__name__}")
            setattr(c, k, v)
        return c

attrs = {"a":"a"} 
c = C.get(**attrs) # 此处会自动抛出ValueError
print(c)

该方案不需要修改原有业务逻辑,新增属性时只要在类层面补充类型注解即可,get方法无需任何改动。如果确实需要把注解写在__init__方法中,也可以通过inspect模块解析方法的字节码或签名读取注解,只是实现复杂度会更高。


方案2:生产环境推荐使用Pydantic库

如果项目允许引入第三方依赖,Pydantic是专门做运行时类型校验的成熟工具,完全基于type hints实现,不需要手写任何校验逻辑,还支持泛型、嵌套类型、自定义校验规则等复杂场景,改后代码示例如下:

from pydantic import BaseModel

class C(BaseModel):
    a: int = 0

    def __str__(self):
        return str(self.a)

# 直接构造实例即可自动触发类型校验
c = C(a="a") # 自动抛出结构化的类型错误,无需额外代码
print(c)

内容的提问来源于stack exchange,提问作者Vince

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:54:09