2016-12-11 14 views
1

YAML AWSクラウドフォーメーションテンプレートをJSONから最近変換しました。Pythonを使用してCloudFormation YAMLをロード

JSONを使用している場合、これらのテンプレートをロードしてjinjaを使用して変換して、それらからいくつかのマークダウン文書を生成することができました。私はYAMLと同じことをpythonでやろうとしています。

私は、YAMLタグを使用する雲形成テンプレートで省略表現の関数構文を使用しています。それはそれらについての知識を持たないので、タグを処理することができませんので、コンストラクタが失敗したruamel.yamlパッケージにこれらをロードしようとして例えば

Properties: 
    MinSize: !Ref ClusterSize 
    MaxSize: !Ref ClusterSize 

YAMLドキュメントをロードして、出力とリソースを取得/照会できるようにする方法がありますか?

+0

「出力」と「資源」は何ですか? – Anthon

答えて

1

ruamel.yamlはタグを処理できないと誤解されています。

import ruamel.yaml 

yaml_str = """\ 
Properties: 
    MinSize: !Ref ClusterSize 
    MaxSize: !Ref ClusterSize 
""" 


class Blob(object): 
    def update(self, value): 
     self.value = value 

    def __str__(self): 
     return str(self.value) 


def my_constructor(self, node): 
    data = Blob() 
    yield data 
    value = self.construct_scalar(node) 
    data.update(value) 

ruamel.yaml.SafeLoader.add_constructor(u'!Ref', my_constructor) 

data = ruamel.yaml.safe_load(yaml_str) 
print('data', data['Properties']['MinSize']) 

プリント:

ClusterSize 

したい場合しかし、あなたはどんな未知のタグを処理する方法に関する情報を提供する必要があり、もちろん、それはあなたが!Refにロードするデータの種類を推測することはできません多くの異なるタグを取り除くために、そして「すべてが文字列であること」を気にしないあなたも行うことができます与える

import ruamel.yaml 

yaml_str = """\ 
Properties: 
    MinSize: !Ref ClusterSize 
    MaxSize: !Ref ClusterSize 
    SizeList: 
    - !abc 1 
    - !xyz 3 
""" 


def general_constructor(loader, tag_suffix, node): 
    return node.value 


ruamel.yaml.SafeLoader.add_multi_constructor(u'!', general_constructor) 


data = ruamel.yaml.safe_load(yaml_str) 
print(data) 

{'Properties': {'SizeList': ['1', '3'], 'MinSize': 'ClusterSize', 'MaxSize': 'ClusterSize'}} 

(スカラー13はなく、通常の整数の文字列として読み込まれていることに注意してください)

+0

ありがとうAnthon、私はruamel.yamlがタグを扱うことができなかったことを意味するわけではありません - それらのタグの動作と実装を知らないだけで、それらを指定する方法がわからないので、 YAML。 タグは無視され、文字列として扱われますか、もっと基本的なレベルでは動作しませんか? – georgealton

+0

すべてが文字列であっても比較的簡単な場合、サンプルYAMLを減らしてしまったので、このようなタグが1つしかなく、ネストされた辞書しかないように見えるのは残念です。私は答えを更新します。 – Anthon

関連する問題