【问题标题】:nested dataclasses to dict嵌套数据类到 dict
【发布时间】:2021-11-29 10:11:02
【问题描述】:

我有很多使用post_init嵌套的数据类

from dataclasses import dataclass
from typing import List
from typing import Optional
from typing import Union


@dataclass
class MyClass:
    signed_key: str
    signature: str


@dataclass
class Message:
    signature: str
    my_class: Union[MyClass, dict]
    protocol_version: str
    signed_message: str

    def __post_init__(self):
        self.my_class = MyClass(**self.my_class)

它工作得很好,但问题是如果我想像这样将 Message 转换为 dict:

#create a message object before
print(message.__dict__)

我得到的输出:

{'signature': 'test', 'my_class': Myclass(signed_key='test', signature='test'), 'protocol_version': 'test', 'signed_message': 'test'}

我想要什么(嵌套字典):

{'signature': 'test', 'my_class': {'signed_key': 'test', 'signature': 'test'}, 'protocol_version': 'test', 'signed_message': 'test'}

我可以使用 attrs 或 pydantic 之类的库,但这里的目标是只使用纯 python

【问题讨论】:

标签: python python-dataclasses


【解决方案1】:

您可以使用dataclasses.asdict(请注意,这是一个模块级函数,不绑定到任何数据类实例),它就是为此目的而设计的。

dataclasses.asdict(instance, *, dict_factory=dict)

转换 数据类实例到字典(通过使用工厂函数 dict_factory)。每个数据类都转换为其字段的字典,如 名称:值对。数据类、字典、列表和元组是递归的 进入。

例子,

>>> from dataclasses import dataclass, asdict
>>>
>>> @dataclass
... class Message:
...     message: str
...
>>>
>>> @dataclass
... class Chat:
...     messages: list[Message]
...
>>> chat = Chat([Message('Hi'), Message("Hello")])
>>> chat.__dict__
{'messages': [Message(message='Hi'), Message(message='Hello')]}
>>> asdict(chat)
{'messages': [{'message': 'Hi'}, {'message': 'Hello'}]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2021-09-25
    相关资源
    最近更新 更多