簡體   English   中英

大膽的占位符如何工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM