我有一个 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 access的代码。 - 如果我只提供最终
MyList
类型,PyCharm 会在我Struct()
通过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