有没有办法将 YAML 转储到与 ruamel.yaml 加载的相同版本中?

Is there a way to dump YAML in same version it was loaded in with ruamel.yaml?

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

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

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

我想避免在 round_trip_dump()

上硬编码 version='1.1'
x = f.read()
d = round_trip_load(x)
round_trip_dump(d, f, explicit_start=True)

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 1.1 时,"unversioned" 读数并未完全重置 yaml 实例指令。

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