在python数据类__init__方法中强制进行类型转换
问题内容:
我有以下非常简单的数据类:
import dataclasses
@dataclasses.dataclass
class Test:
value: int
我创建了该类的实例,但我使用了一个字符串而不是整数:
>>> test = Test('1')
>>> type(test.value)
<class 'str'>
我真正想要的是强制转换为我在类定义中定义的数据类型:
>>> test = Test('1')
>>> type(test.value)
<class 'int'>
我必须__init__
手动编写该方法还是有一种简单的方法来实现此目的?
问题答案:
从强制或检查类型的意义上讲,永远不要遵循dataclass属性的类型提示。大多数情况下,像mypy这样的静态类型检查器都可以完成这项工作,Python在运行时不会这样做,因为它永远不会这样做。
如果要添加手动类型检查代码,请使用以下__post_init__
方法:
@dataclasses.dataclass
class Test:
value: int
def __post_init__(self):
if not isinstance(self.value, int):
raise ValueError('value not an int')
# or self.value = int(self.value)
您可以dataclasses.fields(self)
用来获取Field
指定字段和类型的对象的元组,并在其上循环以针对每个字段自动执行此操作,而无需为每个字段单独编写。
def __post_init__(self):
for field in dataclasses.fields(self):
value = getattr(self, field.name)
if not isinstance(value, field.type):
raise ValueError(f'Expected {field.name} to be {field.type}, '
f'got {repr(value)}')
# or setattr(self, field.name, field.type(value))