python - 在 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__
手动编写该方法还是有一种简单的方法来实现这一点?
解决方案
从强制或检查类型的意义上说,从不遵守数据类属性的类型提示。大多数像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))
推荐阅读
- microsoft-graph-api - 如何通过 Microsoft Outlook Calendar Graph API 查找重复异常
- interpretation - 计算机如何解释数据
- firebase - 在firebase firestore中使用外部orderby而不使用使用的查询不等式
- azure-cognitive-search - 选择查询中 geo.distance 函数的返回值
- r - R:用概率密度函数卷积响应
- c# - WebRequest 在 WinHttpGetProxyForUrl() 中获取 TaskCanceledException
- mysql - Mysql2::Error: 操作数应包含 1 列:
- python - Lambdify 或评估 CoordSys3D
- spring-boot - 带有 Spring 引导的 Apache AVRO
- scala - 光滑 - 使用对象而不是元组插入行