2016-09-15 5 views
0

いくつかの条件が満たされているかどうかを確認できるように、要素のリストをキーとして持つ必要があります。 例(これが可能である場合と、構文が正しいかどうかわからない):要素のリストからなるYAMLキー

mapping: 
    c_id: 
    [pak, gb]: '4711' 
    [pak, ch]: '4712' 
    [pak]: '4713' 
    d_id: 
    . 
    . 
    . 

今私は例のようなアプローチを持つことが可能であるかどうかを知る必要があります。

答えて

2

を使用する必要があります。ここでは、PyYamlでの対応方法を示します。

mapping: 
    c_id: 
    !!python/tuple [pak, gb]: '4711' 
    !!python/tuple [pak, ch]: '4712' 
    !!python/tuple [pak]: '4713' 

トリックはPyYamlに(リストをdictキーとして使用することはできないので)タプルにキーをロードしたいことを伝えることです。 を暗黙的ににする方法はありませんが、これは不可能ではありません。

明示的なキーは、この場合には読みやすくすることができる:

mapping: 
    c_id: 
    ? !!python/tuple [pak, gb] 
    : '4711' 
    ? !!python/tuple [pak, ch] 
    : '4712' 
    ? !!python/tuple [pak] 
    : '4713' 

この例では、最初のものと意味的に等価です。

+0

PyYAMLから他のモジュールに変更することなく、私の問題を保存しました。ありがとう! – GiftZwergrapper

2

あなたのYAMLの構文は正しいです。

import ruamel.yaml 

yaml_str = """\ 
mapping: 
    c_id: 
    [pak, gb]: '4711' 
    [pak, ch]: '4712' 
    [pak]: '4713' 
""" 

data = ruamel.yaml.round_trip_load(yaml_str) 
print(data['mapping']['c_id'][('pak', 'gb')]) 

与える:

4711 

これが不可能であることに注意してください唯一のコツは、Pythonで、キーは不変である必要がありますので、あなたがタプルのような複雑なキーへのアクセスを指定する必要があることですPyYAMLはキーとしてシーケンスをサポートしていないので、ruamel.yaml(免責事項:私はそのパッケージの著者です)

関連する問題