Python数据类:如果执行类型转换,那么使用什么类型?
我有一个Python类,它有一个字段,可以传递几种序列类型中的一种。为了简化,我将使用元组和列表<代码>\uuuu init\uuuu将参数转换为Python数据类:如果执行类型转换,那么使用什么类型?,python,python-dataclasses,Python,Python Dataclasses,我有一个Python类,它有一个字段,可以传递几种序列类型中的一种。为了简化,我将使用元组和列表\uuuu init\uuuu将参数转换为MyList from typing import Union from dataclasses import dataclass, InitVar, field class MyList(list): pass @dataclass class Struct: field: Union[tuple, list, MyList]
MyList
from typing import Union
from dataclasses import dataclass, InitVar, field
class MyList(list):
pass
@dataclass
class Struct:
field: Union[tuple, list, MyList]
def __post_init__(self):
self.field = MyList(self.field)
对于字段
声明,我应该使用什么类型
- 如果我提供了所有可能输入类型的并集,则代码不会记录访问时
字段始终是
MyList
- 如果我只提供最后的
类型,当我传递MyList
aStruct()
时,PyCharm会抱怨list
_field: InitVar[Union[tuple, list, MyList]] = None
field: MyList = field(init=False)
def __post_init__(self, _field):
self.field = MyList(_field)
但这是非常丑陋的,特别是当在3个字段中重复时。此外,我必须构造一个类似于struct(_field=field)
的结构,而不是struct(field=field)
2018年4月,“tm”在PyCharm的公告中评论了这一问题:涉及转换器的问题,在我看来,这似乎是您的要求,以及为什么它们不是数据类的一部分。您当前使用
InitVar
的实现是您场景的预期解决方案。我的转换器用例之一是将用户输入(通过YAML文件)转换为配置结构的类型安全枚举。也许我会使用一个函数来完成这项工作,该函数包装构造函数并转换输入。至于我的另一个将ndarray转换为MyArray的用例,我必须检查我的代码以找到我喜欢的解决方案。我明白了。那么,一个替代方案就是切换到,它支持转换器。与此无关,但由于您提出了它,yaml.load
对于用户输入是不安全的。除非您可以信任您的用户,否则您应该使用yaml.safe\u load
。哦,是的,我使用ruamel.yaml,我相信除了“不安全”之外,所有装载机(包括往返)都是安全的。