我有一组数据类,比如:
from dataclasses import dataclass, asdict, InitVar
@dataclass
class Item:
name: str = None
identifier: int = None
@dataclass
class Container:
item: Item
cid: int
cname: str = None
当我这样做时:
c = Container(Item(name="item-1"), cid=10)
asdict(c)
我得到:
{'item': {'name': 'item-1', 'identifier': None},'cid': 10,'cname': None}
但在我的模式中,项是一种“选择”类型,因此我只想在“asdict”中包含“name”或“identifier”,这取决于实际设置的是哪一个(仅针对项类型)
比如:
{'item': {'name': 'item-1'},'cid': 10,'cname': None}
或:
{'item': {'identifier': 'id-1'},'cid': 10,'cname': None}
我的原始代码更加复杂,关系更加嵌套,因此我正在寻找一种可以应用于特定数据类的解决方案。我试图操纵__dict__
来在__post_init__
中添加属性,但没有成功。例如,我试过了
from dataclasses import dataclass, asdict, InitVar
@dataclass
class Item:
name: InitVar[str] = None
identifier: InitVar[int] = None
def __post_init__(self, name, identifier):
if name:
self.name = name
elif identifier:
self.identifier = identifier
print(self.__dict__)
@dataclass
class Container:
item: Item
identifier: int
cname: str = None
c = Container(Item(name="item-1"), cid=10)
asdict(c)
但那是印刷品
{'item': {}, 'cid': 10, 'cname': None}
这可能不是您想要的,但是在这个时候,当您想要一个
dataclass
的定制的dict
表示时,唯一的方法是编写您自己的.asdict
方法这里有一个建议的起点(可能需要调整):
我没有使用值列表对其进行测试,但请尝试以下方法:
ValidatedDC:https://github.com/EvgeniyBurdin/validated_dc
相关问题 更多 >
编程相关推荐