gpt4 book ai didi

python - PYAML 抛出表示错误

转载 作者:行者123 更新时间:2023-11-28 17:45:51 32 4
gpt4 key购买 nike

我有这个嵌套的字典类,我需要将其实例转储到 YAML 中

class NestedDict(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value

关于倾销这本字典:

pyaml.dump(nesteddict)

我收到此错误(仅发布了整个消息对象的摘录):

"RepresenterError: cannot represent an object: {'a1401': 'ts755', 'ts64': {'topic': {'a1561': 'Process Control'}}, 'a1450': 'ts107', 'a1609': 'ts341', 'a1400': 'ts753', ......

那么如何在 YAML 中巧妙地表示它呢?我读到 PyYAML 确实支持嵌套递归结构。

最佳答案

YAML 确实支持嵌套递归结构:

import ruamel.yaml

data = [1, 3]
data.append(data)

print ruamel.yaml.dump(data)

将为您提供带有 anchor (&id001) 和引用 (*id001) 的 YAML:

&id001
- 1
- 3
- *id001

dict 的简单派生可以被转储,至少用 ruamel.yaml 是这样。也没有问题¹:

import ruamel.yaml

class NestedDict(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value

data = NestedDict(a=1, b=2)
data['c'] = data

print ruamel.yaml.dump(data)

这给你:

&id001 !!python/object/new:__main__.NestedDict
dictitems:
a: 1
b: 2
c: *id001

如果您需要更复杂的表示,例如过滤掉一些dict 值,你必须告诉 ruamel.yaml 如何表示你的对象。要告诉它 NestedDict 有一个代表,您可以使它成为 ruamel.yaml.YAMLObject 的子类,提供一个类属性 yaml_tag = "!NestedDict" 并实现 __repr__();或者您可以提供一个明确的代表。

后者是内部使用的,IMO 更容易实现,因为您可以通过返回对象的字典表示(即顶级键值对)来搭载字典代码。

def nested_dict_representer(dumper, node):
return dumper.represent_mapping("!NestedDict", xyz)

xyz 是您的对象的一些键值对表示。


¹ 免责声明:我是该软件包的作者,它是 PyYAML 的增强版。

关于python - PYAML 抛出表示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18374276/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com