2017-02-17 7 views
3

同じ属性を持つYAMLファイルでいくつかの項目を実行することは可能ですが、実際にそれらを複製する必要はありませんか?
例えば、私がしている:YAMLの同じ属性を持つ2つのアイテム

item1: 
    it_one: 
     some: {...} 
    it_two: 
     somemore: {...} 
item2: 
    the_same_as_in_item1 

どのように私はITEM1とITEM2は、同じ属性を持っていることを、指定することができますか?私がしたい終わり :

item1[it_one][some] 
item2[it_one][some] 

は私に同じ結果を与えます。

答えて

1

あなたを助けるYAMLのメカニズムは、anchors and aliasesを使用しています。 YAMLマッピング(Python dictとしてロード)をエイリアスすると、item1item2に接続された同じdictのインスタンスが取得されるため、注意しなければならないものがあります。

これが必要でない場合は、別名の具体的な解釈がmerge keyという形であります。それがキー<<を指定する使用するには:

item1: &repl 
    it_one: 
     some: {...} 
    it_two: 
     somemore: {...} 
item2: 
    <<: *repl 

これは、少なくとも直接item2下、item1(すなわちキーit_oneit_two)と同じキー/値を持つ新しい辞書をお渡しします。ただし、これらのキー(some: {})の値は、これが内部的にロードされ処理されるため、同じオブジェクトになります。

オブジェクトの再利用のようなものは、あなたがより良いエイリアスの非マージの使用にこだわる、問題がある場合:

item1: &repl 
    it_one: 
     some: {...} 
    it_two: 
     somemore: {...} 
item2: *repl 

と新しいdicts(およびリストにKey-Valueを複製する再帰的に木の上を歩きます)。

ruamel.yamlround_trip_loaderを使用すると、マージキーを使用している場合でもすべてを共有することに注意してください。ラウンドトリップができない場合は、代わりにsafe_loaderを使用してください。

+0

ありがとう、それは私が探していたものです! – Andreios

関連する問題