2016-09-15 4 views
0

私はこのYAMLを持っている:YAMLで参照を使用するにはどうすればよいですか?

app_name: my_app 
version: 
    1.0: 
    path: /my_app/1.0 
    2.0: 
    path: /my_app/2.0 

は、それが何らかの形で「MY_APP」とそのバージョンを入力して避け、代わりに参照のいくつかの並べ替えを使用することにより、YAML自体からそれを読むことは可能ですか?

私は心の中でこのようなものでした:最後に

app_name: my_app 
version: 
    1.0: 
    path: /@app_name/$key[-1] 
    2.0: 
    path: /@app_name/$key[-1] 

を、私はPythonの辞書にこれを読みたいと考えています。

+0

@key [-1]は、この値に関連付けられたキーを1レベル上げることを意味すると仮定して、 '@ 1.0'を実行する必要はないようです。 (もし@key [0]が 'path'を意味するなら) – Anthon

+0

はい、擬似コードを少し変更しました。 – fredrik

答えて

1

YAMLには、スカラーの部分文字列に代入するアンカーとエイリアスがあり、スカラーやコレクション全体(マッピング、シーケンス)を参照するメカニズムはありません。

このようなことをしたい場合は、YAMLで解析した後に置換を行い、さまざまな値を解釈してデータ構造を再構築する必要があります。

YAMLの一部が他の部分を置き換えるための辞書として使用される場合、いくつかの例があります(ここでは[so]を含む)。そのようにすると、YAML入力を一度解析し、ソースで置き換えて、その置換の出力を再解析することができます。 相対参照はあなたのためには機能しないので、解析されたツリーで置換を行う必要があります。 代わりに、パーサーを変更して@を入力から除去し、その場で実行します。

両方の場合において、「ストア」は、その値(@app_name)の鍵をマーキング、ならびにキー自体(@1.0)を格納するためのキーをマークするために同じトークン(@)を使用することが悪い考えであろう、 (2つの全く異なる方法で行う@app_name@key[-1])を使用するために使用されます。

+0

ありがとうございます。このためには、[PyYAML aliases](http://pyyaml.org/wiki/PyYAMLDocumentation#Aliases)または[jsonref](https://pypi.python.org/pypi/jsonref)を使用してください(代わりにJSONを使用することを意味します) YAMLの)、私はバージョン番号を取得するために私はいくつかの解析と代入を自分で行う必要がありますが。私が擬似コードを変更したのは、その中で '@ 'をどのように使用したかに関するあなたのコメントに同意したからです。 – fredrik

+0

私が言及して忘れたことは、 '@'は予約文字であり、それで始まるスカラは引用符で囲む必要があるということです。 '$ 'を使用して関数を導入すると(パラメータを取る' key')、何とかしてより自然に見えます。パーサーをハックしようとするなら、['ruamel.yaml'](https://pypi.python.org/pypi/ruamel.yaml/)を見てください(免責事項:私は著者です)これは、YAML 1.2のサポートやメンテナンスなど、PyYAMLよりも多くの利点があります。 – Anthon

関連する問題