如何利用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
相关产品推荐
相关产品推荐

