如果分配了不同的字段类型,如何使用数据类装饰类以引发错误?

Din*_*avi 6 python-3.x python-dataclasses

我不确定我做错了什么。当传递不同类型的输入时,如何防止 Test 类接受和抛出错误。我正在使用Python 3.9.2

from dataclasses import dataclass, fields


@dataclass
class Test:
    a: str = 'a'
    b: int = 1


t = Test(2, 'b')

print(fields(t))
print(type(t.a))
print(type(t.b))

# output
# (venv) D:\Playground>python dataClassesTest.py
# (Field(name='a',type=<class 'str'>,default='a',default_factory=<dataclasses._MISSING_TYPE object at 0x00000232952D5880>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),_field_type=_FIELD), Field(name='b',type=<class 'int'>,default=1,default_factory=<dataclasses._MISSING_TYPE object at 0x00000232952D5880>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),_field_type=_FIELD))
# <class 'int'>
# <class 'str'>
Run Code Online (Sandbox Code Playgroud)

use*_*511 4

__post_init__这可以通过添加一个方法来解决,dataclass您可以在其中检查类型

(基于此解决方案,进行了一些更正)

def __post_init__(self):
    for f in fields(type(self)):
        if not isinstance(getattr(self, f.name), f.type):
            current_type = type(getattr(self, f.name))
            raise TypeError(f"The field `{f.name}` was assigned by `{current_type}` instead of `{f.type}`")
Run Code Online (Sandbox Code Playgroud)

请注意,此代码在导入时不起作用

from __future__ import annotations
Run Code Online (Sandbox Code Playgroud)

因为这样的type话 中的字段dataclasses.Field就变成了字符串