【发布时间】:2019-03-27 21:38:29
【问题描述】:
我正在尝试在 Python 中(反)序列化具有 collections.defaultdict 属性和 ruamel.yaml 的类(在我的情况下为 3.6+)。
这将是我想要开始工作的一个最小示例:
from collections import defaultdict
import ruamel.yaml
from pathlib import Path
class Foo:
def __init__(self):
self.x = defaultdict()
YAML = ruamel.yaml.YAML(typ="safe")
YAML.register_class(Foo)
YAML.register_class(defaultdict)
fp = Path("./test.yaml")
YAML.dump(Foo(), fp)
YAML.load(fp)
但这失败了:
AttributeError: 'collections.defaultdict' object has no attribute '__dict__'
任何不需要为每个“Foo-like”类编写自定义代码的想法?我希望我可以为 defaultdict 对象添加不同的表示器,但到目前为止我的尝试都是徒劳的。
完整的追溯:
Traceback (most recent call last):
File "./tests/test_yaml.py", line 18, in <module>
YAML.dump(Foo(), fp)
File "C:\miniconda-windows\envs\ratio\lib\site-packages\ruamel\yaml\main.py", line 439, in dump
return self.dump_all([data], stream, _kw, transform=transform)
File "C:\miniconda-windows\envs\ratio\lib\site-packages\ruamel\yaml\main.py", line 453, in dump_all
self._context_manager.dump(data)
File "C:\miniconda-windows\envs\ratio\lib\site-packages\ruamel\yaml\main.py", line 801, in dump
self._yaml.representer.represent(data)
File "C:\miniconda-windows\envs\ratio\lib\site-packages\ruamel\yaml\representer.py", line 81, in represent
node = self.represent_data(data)
File "C:\miniconda-windows\envs\ratio\lib\site-packages\ruamel\yaml\representer.py", line 108, in represent_data
node = self.yaml_representers[data_types[0]](self, data)
File "C:\miniconda-windows\envs\ratio\lib\site-packages\ruamel\yaml\main.py", line 638, in t_y
tag, data, cls, flow_style=representer.default_flow_style
File "C:\miniconda-windows\envs\ratio\lib\site-packages\ruamel\yaml\representer.py", line 384, in represent_yaml_object
return self.represent_mapping(tag, state, flow_style=flow_style)
File "C:\miniconda-windows\envs\ratio\lib\site-packages\ruamel\yaml\representer.py", line 218, in represent_mapping
node_value = self.represent_data(item_value)
File "C:\miniconda-windows\envs\ratio\lib\site-packages\ruamel\yaml\representer.py", line 108, in represent_data
node = self.yaml_representers[data_types[0]](self, data)
File "C:\miniconda-windows\envs\ratio\lib\site-packages\ruamel\yaml\main.py", line 638, in t_y
tag, data, cls, flow_style=representer.default_flow_style
File "C:\miniconda-windows\envs\ratio\lib\site-packages\ruamel\yaml\representer.py", line 383, in represent_yaml_object
state = data.__dict__.copy()
AttributeError: 'collections.defaultdict' object has no attribute '__dict__'
【问题讨论】:
-
我更新了我的答案以处理非无
default_factory参数(特别是如何处理defaultdict(list))
标签: python yaml defaultdict ruamel.yaml