我有一个 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始终为MyListwhen 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