2016-11-03 12 views
1
merge: 
    - &LEFT { x: 1, y: 1, r: 1 } 
    - &BIG { x: 2, y: 2, r: 2 } 
    - &SMALL { x: 3, y: 3, r: 3} 

    - # Override 
    << : [ *BIG, *LEFT, *SMALL ] 
    x: 1 
    label: big/left/small 

私は出力を得る:YAMLの参照先はどのように前のものを上書きできますか?

{ 
    merge: 
    [ 
     { x: 1, y: 1, r: 1 }, 
     { x: 2, y: 2, r: 2 }, 
     { x: 3, y: 3, r: 3 }, 
     { x: 1, y: 2, r: 2, label: 'big/left/small' } 
    ] 
} 

しかし、結果は私の期待、私はそれは私が行うことができますどのように

{ x: 1, y: 3, r: 3, label: 'big/left/small' }. 

ことを願って、マージ対象の最後の1を満たしていませんYAML構文ですか?

答えて

0

これをYAML構文で行うことはできません。あなたの期待は、複数のレベルに根ざしています。

  1. それがマージエイリアスまたは他の任意の別名でもアンカー
  2. トップレベルマッピングキー(であることに基づいて使用される場合にアンカー要素(配列要素か否か)魔法の消えませんその値は、このような削除を示すものではありませんマージインジケータ

Merge Key Language-Independent Typeドキュメントを持つ要素を含むシーケンススカラーではありませんし、どちらもYAML仕様を行うためmerge)が魔法のように消えていません。アンカー(およびエイリアス)は、通常、YAMLの仕様に従って、YAMLの読み込みに使用する言語の表現では保持されません。したがって、アンカーされた要素を見つけて読み込み後に削除するのは通常不可能です。

一般的な解決策は、アンカー「を定義する」ことを最別トップレベルのキーdefaultキーを持っているとmergeキーに関連付けられた値でのみ動作するようになります:

import ruamel.yaml 

yaml_str = """\ 
default: 
    - &LEFT { x: 1, y: 1, r: 1 } 
    - &BIG { x: 2, y: 2, r: 2 } 
    - &SMALL { x: 3, y: 3, r: 3} 

merge: 
    # Override 
    << : [ *BIG, *LEFT, *SMALL ] 
    x: 1 
    label: big/left/small 
""" 

data = ruamel.yaml.load(yaml_str)['merge'] 
print(data) 

することはできます:

{'x': 1, 'r': 2, 'y': 2, 'label': 'big/left/small'} 

(出力のキーの順序はもちろんランダムです)

関連する問題