2016-08-18 14 views
1

ちょうどYAMLとPythonの両方を使い始めています。Pythonでアンカーとエイリアスを含むYAMLを解析しようとしています。
このYAMLでは、特定のノードの値が異なるようにアンカーを上書きします。Pythonで重複したアンカーでYAMLを解析する

私のYAMLの例:私はYAML上記here

スニペットテスト

{ 
    "Some Colors": { 
     "color_primary": "#112233FF", 
     "color_secondary": "#445566FF" 
    }, 
    "Element": { 
     "color": "#112233FF" 
    }, 
    "Overwrite some colors": { 
     "color_primary": "#000000FF" 
    }, 
    "Another element": { 
     "color": "#000000FF" 
    } 
} 

:(JSON中)の予想結果を有する

Some Colors: &some_colors 
color_primary: &color_primary "#112233FF" 
color_secondary: &color_secondary "#445566FF" 

Element: &element 
color: *color_primary 

Overwrite some colors: &overwrite_colors 
color_primary: &color_primary "#000000FF" 

Another element: &another_element 
color: *color_primary 

私が読んだことからYAML docs;これはバージョン1.1から可能だったはずです(私は思う)が、少なくともYAMLバージョン1.2はそれをサポートするべきです。

しかし、私はYAMLを解析しようとするときはいつでも、(yaml.load()付き)PyYAMLとか(ruamel.yaml.load()付き)ruamel,yamlパッケージを使用して、私は「重複したアンカー」エラーが発生します。

私はここで間違っていますか?そしてこれを修正する方法は?

編集:私は上記の質問に対する解決策を見つけたruamelの所有者の助けを借りて

ruamel v0.12.3から上記は正常に機能しますが、ReusedAnchorWarningが届きます。
これらの警告は、次のスニペットを抑えることができます。これが原因であるクレジットを与える

import warnings 
from ruamel.yaml.error import ReusedAnchorWarning 

warnings.simplefilter("ignore", ReusedAnchorWarning) 

。それらのすべてはruamelの所有者に行きます。


追加された質問として、私はに上記のYAML(// <-- Added thisでの変化に気付く)変更する場合:

Some Colors: &some_colors 
color_primary: &color_primary "#112233FF" 
color_secondary: &color_secondary "#445566FF" 

Element: &element 
color: *color_primary 

Overwrite some colors: &overwrite_colors 
<<: *some_colors // <-- Added this to include 'color_secondary' as well 
color_primary: &color_primary "#000000FF" 

Another element: &another_element 
color: *color_primary 

を出力は、次のとおりです。

{ 
    "Some Colors": { 
     "color_primary": "#000000FF", 
     "color_secondary": "#445566FF" 
    }, 
    "Element": { 
     "color": "#112233FF" 
    }, 
    "Overwrite some colors": { 
     "color_primary": "#000000FF", 
     "color_secondary": "#445566FF" 
    }, 
    "Another element": { 
     "color": "#445566FF" // <-- Now the value is 'color_secondary' instead of 'color_primary'? 
    } 
} 

Another elementcolorではなくcolor_secondaryの値を見ているのはなぜ?

これを修正する方法はありますか?

答えて

1

まず、何も間違ってはいません。 PyYAMLはここで何か間違っています。同じ名前のアンカーをダンプすると、PyYAMLのダンプが誤った状態になる可能性が高いため、これが最も可能性があります。あなたは自己参照であるPythonの構造がある場合:

その後、
a = dict(x=1) 
a['y'] = a 

PyYAMLとを(この名前は、それは名前は次のように使用された場所に応じられる一意ではありませんでした場合ruamel.yamlはあなたに固有のアンカー名を作成します。これはYAMLのシリアライゼーションコードのバグを指摘するかもしれないので、再利用されたアンカー名は疑わしいと思うのですが、仕様に反するものではありません(再利用はすでにYAML 1.0 spec(3.2.2.2節) )

python-yaml Debianモジュールのbug reportは2009年以来存在していましたが、アップストリームが終了した場合は見つかりませんでした。

あなたはこれが2つはあなたの2番目の質問に答えるruamel.yaml 0.12.3


で解決されて示されているように、それはちょうどので、「Best Online YAML Converterは」ではありません、この間違ったを解析しています。マージ線でYAMLのコメントがある場合はそれも、エラーがスローされます:ruamel.yaml(0.12.3)に期待されるよう

<<: *some_colors # <-- Added this to include 'color_secondary' as well 

これは、解析します。

import sys 
import ruamel.yaml 
import warnings 
from ruamel.yaml.error import ReusedAnchorWarning 
warnings.simplefilter("ignore", ReusedAnchorWarning) 

yaml_str = """\ 
Some Colors: &some_colors 
color_primary: &color_primary "#112233FF" 
color_secondary: &color_secondary "#445566FF" 

Element: &element 
color: *color_primary 

Overwrite some colors: &overwrite_colors 
<<: *some_colors # <-- Added this to include 'color_secondary' as well 
color_primary: &color_primary "#000000FF" 

Another element: &another_element 
color: *color_primary 
""" 


data = ruamel.yaml.load(yaml_str) 
ruamel.yaml.round_trip_dump(data, sys.stdout) 

ができます:

Some Colors: 
    color_primary: '#112233FF' 
    color_secondary: '#445566FF' 
Overwrite some colors: 
    color_primary: '#000000FF' 
    color_secondary: '#445566FF' 
Another element: 
    color: '#000000FF' # <- not #445566FF 
Element: 
    color: '#112233FF' 

(手作業でコメントが追加されました)

+0

サー、歌、賞賛!あなたの答えに述べているのは、真実です。 「_Best_ Online YAML Converter」は、結局のところ最高のものではなかったようです。ありがとう、これは私に多くの頭痛を免れました! –

+0

pyyamlの[現在のバグレポートを開いた](https://bitbucket.org/xi/pyyaml/issues/66/duplicate-anchors-result-in-exception)私は楽観主義者だと思う。 – tedder42

関連する問題