私はSwaggerを使用するプロジェクトに参加しました。私は、彼らがSwagger.yaml
にプレースホルダのこの種を使用している参照してください。すごいプレースホルダはどのように機能しますか?
MYKey: &CONST_MY_KEY ""
この作品とどこがCONST_MY_KEY
を定義しますどのように?
私はSwaggerを使用するプロジェクトに参加しました。私は、彼らがSwagger.yaml
にプレースホルダのこの種を使用している参照してください。すごいプレースホルダはどのように機能しますか?
MYKey: &CONST_MY_KEY ""
この作品とどこがCONST_MY_KEY
を定義しますどのように?
あなたはどこにもCONST_MY_KEY
を定義しない、&
は、オブジェクト""
のためのアンカーとしてこれを紹介しています。これを*
で別名を指定して*CONST_MY_KEY
とすることで、YAMLファイルの後の段階で再利用できます。アンカーとエイリアスの
主理由は、@ 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))
あなたが得られます(ほとんどであるためdata['b']
の値が変化しないことを
a ''
b ''
a 'hello'
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
がマッピング上のアンカーであると予想されます。そのために、エイリアスが使用されるマッピングにキーと値のペアが追加されます。
これはアンカーとして知られている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
あなたが引用しているマージ拡張は、YAML標準の一部ではなく、一部のYAMLパーサーのみで実装されている拡張です(ただし、標準を書いた人が定義しています)。キーとその対応する値のアンカーのマッピングで同じ名前を使用すると(例のように一貫して)、何らかの関係があると人間に混乱させることがよくありますが、**良い例は常にそれらのエンティティに対して異なるスカラーを使います。 – Anthon
MYKeyはどうですか? – fastcodejava
「MYKey」についてはどうですか? – fastcodejava
@fastcodejava: 'MYKey'は通常のスカラで、値' '" 'のキーとして機能します。アンカー 'CONST_MY_KEY'を定義する必要はありませんが、複数のアンカーを定義したい場合、それらを保持するコレクションとしてマッピング(またはシーケンス)を持つ必要があります。 – Anthon