这是我的YAML
a: &SS Moyshale
b: *SS
c: &SS Moyshale2
d: *SS
这是一个有效的YAML吗? (我希望d
等于Moyshale2
)
答案 0 :(得分:1)
当从序列化事件组成表示图时,别名节点引用具有指定锚的序列化中的最新节点。因此,锚点在序列化中不必是唯一的。
因此d
应该等于SS
的最新“定义”。
有些解析器会抛出一个警告,您必须将其过滤掉:
import sys
import warnings
import ruamel.yaml
yaml_str = """\
a: &SS Moyshale
b: *SS
c: &SS Moyshale2
d: *SS
"""
with warnings.catch_warnings(): # ignore the re
warnings.simplefilter('ignore')
data = ruamel.yaml.round_trip_load(yaml_str)
ruamel.yaml.round_trip_dump(data, sys.stdout)
您将获得以下输出:
a: Moyshale
b: Moyshale
c: Moyshale2
d: Moyshale2
如果没有过滤器,您还可以获得:
..../lib/python3.5/site-packages/ruamel/yaml/composer.py:98: ReusedAnchorWarning:
found duplicate anchor 'SS'
first occurence in "<unicode string>", line 1, column 4:
a: &SS Moyshale
^
second occurence in "<unicode string>", line 3, column 4:
c: &SS Moyshale2
^
warnings.warn(ws, ReusedAnchorWarning)
请注意,字符串标量上的别名(当前)未保留在ruamel.yaml
¹中,并且由于锚点没有关联的别名,因此它们不包含在输出中。如果您将Moyshale
和Moyshale2
更改为[Moyshale]
和[Moyshale2]
,则输出会包含锚点SS
两次:
a: &SS [Moyshale]
b: *SS
c: &SS [Moyshale2]
d: *SS
¹这是使用ruamel.yaml YAML 1.2解析器完成的,我是作者。