以同一名称放置两个锚是否有效YAML

时间:2016-11-02 07:55:06

标签: yaml

这是我的YAML

a: &SS Moyshale
b:  *SS
c: &SS Moyshale2
d:  *SS

这是一个有效的YAML吗? (我希望d等于Moyshale2

1 个答案:

答案 0 :(得分:1)

根据YAML 1.2 specification

,这是有效的YAML
  

当从序列化事件组成表示图时,别名节点引用具有指定锚的序列化中的最新节点。因此,锚点在序列化中不必是唯一的。

因此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¹中,并且由于锚点没有关联的别名,因此它们不包含在输出中。如果您将MoyshaleMoyshale2更改为[Moyshale][Moyshale2],则输出会包含锚点SS两次:

a: &SS [Moyshale]
b: *SS
c: &SS [Moyshale2]
d: *SS

¹这是使用ruamel.yaml YAML 1.2解析器完成的,我是作者。