Pyyaml:继承 类 的默认转储行为

Pyyaml: Default dump behavior for inherited classes

我有一个 class 继承自其中一个内置函数:

from yaml import YAMLObject, dump
class D(dict, YAMLObject):
   yaml_tag = u'!!map'
   ...

有没有办法告诉 pyyaml D 的任何实例的转储都应该像父(在本例中是 dict)一样对待?即,我想要以下输出:

d = {'a':1}
print( dump(d) )
>>> a: 1

而不是

print( dump(D(d)) )
>>> !%21map {}

如您所见,我已经尝试为 class 分配一个默认标签,但效果并不理想。 不幸的是,定义自定义转储程序不是一个选项。

您可以在 D class:

中提供自定义 to_yaml 方法
import yaml


class D(dict, yaml.YAMLObject):
    yaml_tag = "!map"

    @classmethod
    def to_yaml(cls, dumper, data):
        return dumper.represent_dict(dict(data))


d = D({"foo": "bar"})
print(yaml.dump(d))

上面的输出是:

foo: bar

请注意,这仅适用于 yaml.dump,不适用于 yaml.safe_dumpyaml_tag的值看似无关紧要,但必须设置;如果不设置它,上面的输出将是:

!!python/object/new:__main__.D
dictitems:
  foo: bar

简短补充:在转储数据之前先将数据转换回 dict 是另一个我完全错过的优雅解决方案:

d = D({'a':1})
print( dump(dict(d)) )
>>> a: 1