在使用PyYAML转储器时如何添加类型标记?

时间:2016-03-30 17:23:21

标签: python yaml pyyaml

我有一个普通的数据结构,我需要将其转储到YAML文件中,并在开头添加一个!v2行的类型标记。

如何使用PyYAML库?

import yaml

class MyDumper(yaml.SafeDumper):
    # ???
    # somehow add a "!v2" type tag at the beginning

y = {'foo': 3, 'bar': 'haha', 'baz': [1,2,3]}

with open(myfile, 'w') as f:
   # a hack would be to write the "!v2" here,
   # outside the normal yaml.dump process, 
   # but I'd like to learn the right way
   yaml.dump(f, y, Dumper=MyDumper)

1 个答案:

答案 0 :(得分:1)

如果我正确地读了你的!v2,那么它本质上是顶级词典的标签(从而隐含了整个文件)。为了用标签正确地写出来,将顶级字典转换为单独的类型(从dict子类)并创建一个特定类型的转储器:

import ruamel.yaml as yaml
from ruamel.yaml.representer import RoundTripRepresenter

class VersionedDict(dict):
    pass

y = VersionedDict(foo=3, bar='haha', baz=[1,2,3])

def vdict_representer(dumper, data):
    return dumper.represent_mapping('!v2', dict(data))

RoundTripRepresenter.add_representer(VersionedDict, vdict_representer)

print(yaml.round_trip_dump(y))

会给你:

!v2
bar: haha
foo: 3
baz:
- 1
- 2
- 3

roundtrip_dump 一个safe_dump

请注意,当您以某种方式使用yaml.load()加载时,您的加载程序希望为constructor标记类型找到!v2,除非您阅读了第一行之外的第一行实际的装载程序。

如果你必须坚持使用PyYAML(例如,如果你必须坚持使用YAML 1.1),那么ruamel.yaml(其中我是作者)是PyYAML的增强版本,那么你应该这样做能够相对容易地做出必要的改变。请确保在使用SafeRepresenter时将代表服务器添加到您用于转储的代表服务器:safe_dump