如何强制执行数据类字段的类型?
How to enforce dataclass fields' types?
在此代码中:
import dataclasses
@dataclasses.dataclass
class MyClass:
value: str
obj = MyClass(value=1)
数据类 MyClass
实例化的值不符合 value
类型。
是否有一种简单的方法(使用装饰器,dataclass
装饰器或库中的参数)强制字段类型,以便我示例中的最后一行引发 ValueError
或像那样的东西?以这种方式强制类型有一个主要缺点吗?
您可以声明一个自定义 __post_init__
方法(参见 python's doc)并将所有检查放在那里以强制进行类型检查。这个方法可以在parent的class中声明以减少变化量。
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 TypeError(f"The field `{name}` was assigned by `{current_type}` instead of `{field_type}`")
print("Check is passed successfully")
@dataclasses.dataclass()
class MyClass(Parent):
value: str
obj1 = MyClass(value="1")
obj2 = MyClass(value=1)
结果:
Check is passed successfully
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 3, in __init__
File "<stdin>", line 7, in __post_init__
TypeError: The field `value` was assigned by `<class 'int'>` instead of `<class 'str'>`
在此代码中:
import dataclasses
@dataclasses.dataclass
class MyClass:
value: str
obj = MyClass(value=1)
数据类 MyClass
实例化的值不符合 value
类型。
是否有一种简单的方法(使用装饰器,dataclass
装饰器或库中的参数)强制字段类型,以便我示例中的最后一行引发 ValueError
或像那样的东西?以这种方式强制类型有一个主要缺点吗?
您可以声明一个自定义 __post_init__
方法(参见 python's doc)并将所有检查放在那里以强制进行类型检查。这个方法可以在parent的class中声明以减少变化量。
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 TypeError(f"The field `{name}` was assigned by `{current_type}` instead of `{field_type}`")
print("Check is passed successfully")
@dataclasses.dataclass()
class MyClass(Parent):
value: str
obj1 = MyClass(value="1")
obj2 = MyClass(value=1)
结果:
Check is passed successfully
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 3, in __init__
File "<stdin>", line 7, in __post_init__
TypeError: The field `value` was assigned by `<class 'int'>` instead of `<class 'str'>`