如何添加对加载 yaml 的字典的新引用?

How to add new references to a yaml-loaded dict?

我正在加载一个 yaml 字典,并想在再次写出之前使用一些现有的锚点来扩展字典。这可能吗?

例如,假设我有一个 yaml 文件:

a: &a 1
b: &b 2

使用 ruamel,我将如何添加引用 a 的新值 c。也就是说,我要怎么写:

a: &a 1
b: &b 2
c: *a

锚定标量 1 作为 ScalarInt 而不是整数加载到 ruamel.yaml 中,如 integer 没有地方可以附加实际的锚点名称,更重要的是因为倾销 相同的整数不会导致锚定标量和别名。但是当同一个 ScalarInt 实例 被丢弃,您将获得第一个锚点和所有其他事件的别名。

(如果您只需要使用加载的数据,ScalarInt 将像普通整数一样用于所有常见用途。)

要获得所需的输出,您需要使与键 c 关联的值相同 作为 a 的值。你可以简单地通过分配来做到这一点:

import sys
import ruamel.yaml

yaml_str = """\
a: &a 1
b: &b 2
"""

yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
data['c'] = data['a']
yaml.dump(data, sys.stdout)

给出:

a: &a 1
b: &b 2
c: *a

如果您想从 Python 代码开始,而不是加载一些带有锚点的 YAML, 您需要自己创建 ScalarInt

import sys
import ruamel.yaml

yaml = ruamel.yaml.YAML()
a_val = ruamel.yaml.scalarint.ScalarInt(1, anchor='a')
data = dict(a=a_val, b=ruamel.yaml.scalarint.ScalarInt(2, anchor='b'), c=a_val)
yaml.dump(data, sys.stdout)

这也给出了:

a: &a 1
b: &b 2
c: *a