2016-06-12 15 views

答えて

1

あなたはどこにも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がマッピング上のアンカーであると予想されます。そのために、エイリアスが使用されるマッピングにキーと値のペアが追加されます。

+0

「MYKey」についてはどうですか? – fastcodejava

+1

@fastcodejava: 'MYKey'は通常のスカラで、値' '" 'のキーとして機能します。アンカー 'CONST_MY_KEY'を定義する必要はありませんが、複数のアンカーを定義したい場合、それらを保持するコレクションとしてマッピング(またはシーケンス)を持つ必要があります。 – Anthon

1

これはアンカーとして知られている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 
+1

あなたが引用しているマージ拡張は、YAML標準の一部ではなく、一部のYAMLパーサーのみで実装されている拡張です(ただし、標準を書いた人が定義しています)。キーとその対応する値のアンカーのマッピングで同じ名前を使用すると(例のように一貫して)、何らかの関係があると人間に混乱させることがよくありますが、**良い例は常にそれらのエンティティに対して異なるスカラーを使います。 – Anthon

+0

MYKeyはどうですか? – fastcodejava

関連する問題