gpt4 book ai didi

python - 使用 PyYAML 转储程序时如何添加类型标签?

转载 作者:太空宇宙 更新时间:2023-11-03 16:45:50 24 4
gpt4 key购买 nike

我有一个普通的数据结构,需要将其转储到 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)

最佳答案

如果我读了你的!v2正确地添加,这本质上是顶级字典的标签(因此对于整个文件来说是隐式的)。为了使用标签正确地写出该内容,请将该顶级字典转换为单独的类型(从字典子类化)并创建一个特定于类型的转储器:

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标记类型,除非您在实际加载例程之外读取第一行。

<小时/>

以上是用 ruamel.yaml 完成的(我是作者)PyYAML 的增强版本,如果您必须坚持使用 PyYAML(例如,如果您必须坚持使用 YAML 1.1),那么您应该能够相对轻松地进行必要的更改。只需确保将代表添加到您用于转储的代表中:SafeRepresenter当使用safe_dump时.

关于python - 使用 PyYAML 转储程序时如何添加类型标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36315644/

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