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))