Python 为dataclass编写泛型方法以检查类型

Python 为dataclass编写泛型方法以检查类型,python,python-3.x,Python,Python 3.x,如果我有以下数据类: @dataclasses.dataclass class Something: first: str last: str age: int = 0 ... 检查所有参数类型的通用方法是什么?目前我有一些类似于: def verify_types(dataclass_obj): for field_name, field_info in dataclass_obj.__dataclass_fields__.items():

如果我有以下数据类:

@dataclasses.dataclass
class Something:
    first: str
    last: str
    age: int = 0
    ...
检查所有参数类型的通用方法是什么?目前我有一些类似于:

def verify_types(dataclass_obj):
    for field_name, field_info in dataclass_obj.__dataclass_fields__.items():
        value = getattr(obj, field_name)
        expected_type = field_info.type
        actual_type   = type(value)
        print (f"Field: {field_name} | Value: {value} "
               f"Type: {actual_type} | ExpectedType: {expected_type}"
        )
        if expected_type != actual_type:
            print ('Type error')
有没有比这更好的方法(比如每次初始化dataclass时都可以添加的
mixin

一个选项是使用以下方法:

一种选择是使用以下方法:


在运行时执行类型提示的另一种方法是使用已经存在的成熟解决方案—包。它包装了dataclass,使用pydantic的示例代码如下:

来自pydantic import BaseModel的

类(基本模型):
第一:str
最后:str
年龄:int=0
...
正如作者所说:

pydantic在运行时强制执行类型提示,并在数据无效时提供用户友好的错误


在运行时执行类型提示的另一种方法是使用已经存在的成熟解决方案—包。它包装了dataclass,使用pydantic的示例代码如下:

来自pydantic import BaseModel的

类(基本模型):
第一:str
最后:str
年龄:int=0
...
正如作者所说:

pydantic在运行时强制执行类型提示,并在数据无效时提供用户友好的错误

class StrictTypes:
    def __post_init__(self):
        for field_name, field_info in self.__dataclass_fields__.items():
            value = getattr(self, field_name)
            if type(value) != field_info.type:
                raise SystemExit(f"Invalid type of '{type(value).__name__}' on field {field_name}")

@dataclasses.dataclass
class Something(StrictTypes):
    ...