PYAML抛出了一个陈述

2024-09-28 15:36:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个嵌套的dictionary类,它的实例需要转储到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

倾倒这本词典时:

^{pr2}$

我得到了这个错误(只有发布的整个消息对象的摘录):

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

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


Tags: of实例selfyamldictionaryreturnvalueitem
1条回答
网友
1楼 · 发布于 2024-09-28 15:36:36

YAML支持嵌套递归结构:

import ruamel.yaml

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

print ruamel.yaml.dump(data)

将为您提供一个锚(&id001)和一个引用(*id001)的YAML:

^{pr2}$

你的一个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值,你必须告诉拉梅尔亚姆勒如何表示对象。 要告诉它NestedDict有一个representer,您可以使它成为ruamel.yaml.YAMLObject的子类,提供一个类属性yaml_tag = "!NestedDict"并实现{};或者可以提供一个显式的representer。在

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

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

其中xyz是对象的一些键值对表示。在


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

相关问题 更多 >