Express 招摇过市占位符是如何工作的?

Express 招摇过市占位符是如何工作的?,express,yaml,swagger,Express,Yaml,Swagger,​我参加了一个使用招摇过市的项目。我看他们有​​ 在Swagger.yaml中使用此类占位符: MYKey: &CONST_MY_KEY "" 这是如何工作的?我在哪里定义CONST_MY_KEY?这是一种被称为锚的YAML构造,并不特定于swagger 您编写的代码实际上将锚点CONST_MY_KEY定义为空字符串。&-前缀表示您正在定义它。如果您希望稍后在文档中重用此锚点,您可以使用*-前缀来引用它,例如*CONST\u MY\u KEY 以下是对以下内容的解释性摘录: #YA

​我参加了一个使用招摇过市的项目。我看他们有​​ 在
Swagger.yaml
中使用此类占位符:

  MYKey: &CONST_MY_KEY ""

这是如何工作的?我在哪里定义
CONST_MY_KEY

这是一种被称为锚的YAML构造,并不特定于swagger

您编写的代码实际上将锚点
CONST_MY_KEY
定义为空字符串。
&
-前缀表示您正在定义它。如果您希望稍后在文档中重用此锚点,您可以使用
*
-前缀来引用它,例如
*CONST\u MY\u KEY

以下是对以下内容的解释性摘录:

#YAML还有一个名为“锚定”的便捷功能,可以让您轻松复制
#文档中的内容。这两个键将具有相同的值:
锚定内容:&锚定名称此字符串将显示为两个键的值。
其他主播:*主播名称
#定位点可用于复制/继承特性
基地:&基地
名字:每个人都有相同的名字
foo:&foo

您没有在任何地方定义
CONST\u MY\u KEY
&
将其作为对象
的锚点引入。通过使用
*
指定别名:
*CONST\u MY\u KEY
,您可以在YAML文件的稍后阶段重用该别名

锚和别名的主要原因是而不是像@smartcaveman的回答所指出的那样复制内容。是的

如果没有此功能,甚至无法转储以下简单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']
实际上是同一个对象,更改一个对象会更改另一个对象


您引用的合并扩展的用法是仅在某些YAML解析器中实现的扩展,而不是YAML标准的一部分(尽管定义是由编写标准的人员完成的)。在映射中为键使用相同的名称,并为相应的值使用锚点(正如您的示例一贯所做的那样),这常常会让人们误以为存在某种关系,一个好的示例总是为这些实体使用不同的标量。那么
MYKey
呢?@fastcodejava:
MYKey
是一个普通标量,用作值
的键。无需定义锚点
CONST_MY_KEY
,但如果要定义多个锚点,则需要将映射(或序列)作为集合来保存它们。
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))