Python数据类:如果执行类型转换,那么使用什么类型?

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]

我有一个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]

    def __post_init__(self):
        self.field = MyList(self.field)
对于
字段
声明,我应该使用什么类型

  • 如果我提供了所有可能输入类型的并集,则代码不会记录访问时
    字段始终是
    MyList
  • 如果我只提供最后的
    MyList
    类型,当我传递
    Struct()
    a
    list
    时,PyCharm会抱怨
我可以使用:

_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,我相信除了“不安全”之外,所有装载机(包括往返)都是安全的。