如何强制执行数据类字段类型?

2024-09-28 17:06:48 发布

您现在位置:Python中文网/ 问答频道 /正文

在本规范中:

import dataclasses

@dataclasses.dataclass
class MyClass:
    value: str

obj = MyClass(value=1)

数据类MyClass用一个不服从value类型的值实例化。你知道吗

有没有一种简单的方法(使用一个decorator,dataclassdecorator或库中的一个参数)来强制执行字段的类型,以便我的示例中的最后一行引发一个ValueError或类似的结果?以这种方式强制类型是否有一个主要的缺点?你知道吗


Tags: 数据实例方法import规范obj类型value
1条回答
网友
1楼 · 发布于 2024-09-28 17:06:48

您可以声明一个定制的__post_init__方法(参见python's doc),并将所有检查放在那里以强制类型检查。可以在父类中声明此方法以减少更改量。你知道吗

import dataclasses


@dataclasses.dataclass()
class Parent:
    def __post_init__(self):
        for (name, field_type) in self.__annotations__.items():
            if not isinstance(self.__dict__[name], field_type):
                current_type = type(self.__dict__[name])
                raise ValueError(f"The field `{name}` was assigned by `{current_type}` instead of `{field_type}`")

        print("Check is passed successfully")


@dataclasses.dataclass()
class MyClass(Test):
    value: str


obj1 = MyClass(value="1")
obj2 = MyClass(value=1)

结果是:

Check is passed successfully
Traceback (most recent call last):
  File "2.py", line 18, in <module>
    obj2 = MyClass(value=1)
  File "<string>", line 3, in __init__
  File "2.py", line 12, in __post_init__
    raise ValueError(f"The field `{name}` was assigned by `{current_type}` instead of `{field_type}`")
ValueError: The field `value` was assigned by `<class 'int'>` instead of `<class 'str'>`

相关问题 更多 >