我加入了一个使用Swagger的项目。我看到他们在Swagger.yaml
:
MYKey: &CONST_MY_KEY ""
这是如何工作的?我在哪里定义CONST_MY_KEY
?
答案 0 :(得分:1)
这是一个称为锚点的YAML构造,并不特定于招摇。
您编写的代码实际上将锚CONST_MY_KEY
定义为空字符串。 &
- 前缀表示您正在定义它。如果您希望稍后在文档中重复使用此锚点,则可以使用*
- 前缀来引用它,而不是*CONST_MY_KEY
。
以下是https://learnxinyminutes.com/docs/yaml/的解释摘录:
# YAML also has a handy feature called 'anchors', which let you easily duplicate
# content across your document. Both of these keys will have the same value:
anchored_content: &anchor_name This string will appear as the value of two keys.
other_anchor: *anchor_name
# Anchors can be used to duplicate/inherit properties
base: &base
name: Everyone has same name
foo: &foo
<<: *base
age: 10
bar: &bar
<<: *base
age: 20
答案 1 :(得分:1)
您没有在任何地方定义CONST_MY_KEY
,&
会将此作为对象""
的锚点引入。您可以在YAML文件的后续阶段重复使用此操作,方法是使用*
指定别名:*CONST_MY_KEY
。
锚点和别名的主要原因是不来复制内容,如@smartcaveman的答案所示。它是represent a node in multiple locations in the representation graph。
如果没有此功能,则无法转储以下简单的Python构造:
data = dict(a=1)
data['b'] = data
如果您转储上述内容:
import sys
import ruamel.yaml
ruamel.yaml.round_trip_dump(data, sys.stdout)
你会得到:
&id001
a: 1
b: *id001
根据您使用的语言及其YAML解析器,在标量上使用锚点,可能仅对以后不必重复该值有用,而没有您使用集合(映射,序列)实际获得的优势引用同一个对象。同样在Python中,更流行的解析器加载标量是在不同的实体中完成的:
import ruamel.yaml
yaml_str = """\
a: &CONST_MY_KEY ""
b: *CONST_MY_KEY
"""
data = ruamel.yaml.round_trip_load(yaml_str)
print('a {a!r}'.format(**data))
print('b {b!r}'.format(**data))
data['a'] = 'hello'
print('a {a!r}'.format(**data))
print('b {b!r}'.format(**data))
给你:
a ''
b ''
a 'hello'
b ''
请注意,data['b']
的值不会更改,因为(在大多数解析器中)标量不会构造为引用对象。
如果您使用原始示例执行此操作:
import ruamel.yaml
yaml_str = """\
&id001
b: *id001
a: 1
"""
data = ruamel.yaml.round_trip_load(yaml_str)
print('a {a!r}'.format(**data))
data['b']['a'] = 2
print('a {a!r}'.format(**data))
因为data['a']
和data['b']['a']
实际上是同一个对象,而更改一个会改变另一个。
<<: *name
的使用是非标准的YAML扩展。它期望&name
成为映射的锚点,为此,键值对将添加到使用别名的映射中。