0

有没有一种好方法ruamel.yaml可以将 YAML 文件转储到与加载时相同的版本中?如果我%YAML 1.1在文件中有一个指令,我希望能够在 YAML 1.1 中转储文件,而无需硬编码version='1.1'.

所以给定一些数据,比如,

%YAML 1.1
---
is_string: 'on'
is_boolean: on

我想避免version='1.1'round_trip_dump(),

x = f.read()
d = round_trip_load(x)
round_trip_dump(d, f, explicit_start=True)
4

1 回答 1

1

YAML 文件的版本是一个短暂的值,加载后会重置。我计划以某种方式使加载的最新文档的版本可用,但是在流中有多个文档时,这需要更多考虑。

对于单个文档流,您可以执行以下操作以从指令中捕获版本。这一切都是通过新的 API 完成的。使用您在示例中使用的旧 API 也是可能的,但更加困难,因为没有YAML()实例可以将属性附加到:

import sys
from ruamel.yaml import YAML
from ruamel.yaml.parser import Parser

yaml_str = """\
%YAML 1.1
---
is_string: 'on'
is_boolean: on
"""

class MyParser(Parser):
    def dispose(self):
        self.loader.last_yaml_version = self.yaml_version
        Parser.dispose(self)


yaml = YAML()
yaml.Parser = MyParser
data = yaml.load(yaml_str)

yaml2 = YAML()
yaml2.version = yaml.last_yaml_version
yaml2.dump(data, sys.stdout)

这使:

%YAML 1.1
---
is_string: 'on'
is_boolean: true

yaml请注意,有必要为输出创建一个干净的新对象,因为在遇到%YAML 1.1指令时,“未版本化”读取不会完全重置实例。

也可以转储与is_booleanas关联的值on,但这会影响流中的所有布尔值。

于 2017-12-28T22:47:32.537 回答