[英]How does swagger placeholders work?
``我加入了一個使用Swagger的項目。 我看到他們在Swagger.yaml
使用了這種占位符:
MYKey: &CONST_MY_KEY ""
這是如何工作的,以及在哪里定義CONST_MY_KEY
?
這是一個稱為錨的YAML構造,並非專門針對搖搖欲墜。
您編寫的代碼實際上將錨點CONST_MY_KEY
定義為空字符串。 &
-prefix表示您正在定義它。 如果您想稍后在文檔中重用此錨,則可以使用*
前綴而不是*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
您無需在任何地方定義CONST_MY_KEY
, &
將其引入為對象""
的錨點。 通過使用*
指定別名: *CONST_MY_KEY
可以在YAML文件的后續階段中重新使用*CONST_MY_KEY
。
錨桿和別名的主要原因是不重復的內容作為@ 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']
實際上是同一對象,所以更改一個將更改另一個對象。
<<: *name
的用法是非標准的YAML擴展名。 它期望&name
是映射的錨,將鍵/值對添加到使用別名的映射上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.