我有一个 Python 类,其中有一个可以传递多种序列类型之一的字段。为了简化,我将坚持使用元组和列表。__init__
将参数转换为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)
我应该使用什么类型的field
宣言?
- 如果我提供所有可能的输入类型的并集,则代码不会记录这一点
field
总是一个MyList
when accessed.
- 如果我只提供最终的
MyList
类型,当我通过时 PyCharm 会抱怨Struct()
a 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的公告上评论了这个问题:https://blog.jetbrains.com/pycharm/2018/04/python-37-introducing-data-class/#comment-323957 https://blog.jetbrains.com/pycharm/2018/04/python-37-introducing-data-class/#comment-323957
您将向属性赋值与代码混为一谈produces要分配给属性的值。我将使用一个单独的类方法来将两段代码分开。
from dataclasses import dataclass
class MyList(list):
pass
@dataclass
class Struct:
field: MyList
@classmethod
def from_iterable(cls, x):
return cls(MyList(x))
s1 = Struct(MyList([1,2,3]))
s2 = Struct.from_iterable((4,5,6))
现在轮到你only传递现有值MyList
to Struct.__init__
。元组、列表以及其他任何内容MyList
可以接受传递给Struct.from_iterable
相反,它将负责构建MyList
要传递到的实例Struct
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)