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_dump
。 yaml_tag
的值看似无关紧要,但必须设置;如果不设置它,上面的输出将是:
!!python/object/new:__main__.D
dictitems:
foo: bar
简短补充:在转储数据之前先将数据转换回 dict
是另一个我完全错过的优雅解决方案:
d = D({'a':1})
print( dump(dict(d)) )
>>> a: 1
我有一个 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_dump
。 yaml_tag
的值看似无关紧要,但必须设置;如果不设置它,上面的输出将是:
!!python/object/new:__main__.D
dictitems:
foo: bar
简短补充:在转储数据之前先将数据转换回 dict
是另一个我完全错过的优雅解决方案:
d = D({'a':1})
print( dump(dict(d)) )
>>> a: 1