2017-01-23 3 views
1

私は、コメントを追加してからYAMLに変換したいデータ構造を持っています。* RoundTripLoader経由で*読み込まれていないデータ構造のコメントを生成していますか?

データ構造をYAMLとして出力し、RoundTripLoaderを使用して戻すことを避けたいと思います。

データ構造をruamel.yamlコメントインターフェイスをサポートするものに変換する方法はありますか?

答えて

1

方法はありますが、そのためのインターフェイスは安定しているとは限りません。 それゆえに、文書化の不足のために、あなたの期待される出力であるround_trip_loading()の表記、またはそれの小さなサンプルを見てください。

特別なバージョンの構造化ノード(マッピングとシーケンス)の表現にコメントが付いていることに気づかなければなりません。 safe_load()をPython dictとしてマッピングする場合、これはCommentedMap()であり、シーケンスの場合はPython listとしてロードされます。これはCommentedSeq()です。

これらのクラスは両方とも、キー/値ペアrespの後に行末コメントとして構造ノードの前に発生する可能性のあるコメントを保持する.ca属性を持つことができます。アイテム、キー値のペアまたは項目間、およびノー​​ドの終わりにある行に表示されます。あなたはそれが(例えば、ルーチンcomment_prep()によって自動的に/再帰的に行うことができる)上のコメント必要があり、あなたが持っている任意のdictlistを変換して、コメントを付けるために、正しいポイントと方法を見つけるしなければならないことを意味

コメント操作ルーチンが安定していないので、変更があった場合に更新する場所を1か所にするために、ルーチンを追加してコメントをラップするようにしてください。

import sys 
from ruamel.yaml import round_trip_dump as rtd 
from ruamel.yaml.comments import CommentedMap, CommentedSeq 

# please note that because of the dict the order of the keys is undetermined 
data = dict(a=1, b=2, c=['x', 'y', dict(k='i', l=42, m='∞')]) 

rtd(data, sys.stdout) 
print('-' * 30) 


def comment_prep(base): 
    """replace all dict with CommentedMap and list with CommentedSeq""" 
    if isinstance(base, dict): 
     ret_val = CommentedMap() 
     for key in sorted(base): # here we force sorted order 
      ret_val[key] = comment_prep(base[key]) 
     return ret_val 
    if isinstance(base, list): 
     ret_val = CommentedSeq() 
     for item in base: 
      ret_val.append(comment_prep(item)) 
     return ret_val 
    return base 

data = comment_prep(data) 
data['c'][2].yaml_add_eol_comment('# this is the answer', key='l', column=15) 
rtd(data, sys.stdout) 

います:

c: 
- x 
- y 
- k: i 
    m: ∞ 
    l: 42 
b: 2 
a: 1 
------------------------------ 
a: 1 
b: 2 
c: 
- x 
- y 
- k: i 
    l: 42  # this is the answer 
    m: ∞ 

にファイルtest_comment_manipulation.pyを、いくつかのより多くの例があり、(インターフェースの変更、ので、ファイルになりますテストなど)に目を維持するのに適した場所です。 `データ= CommentedMap([ ( 'A'、1)、 ( 'B'、2)、 :あなたはもちろんなく直接第`リスト/ dict`を作る `CommentedSeq/Dict`を作成することができ

+0

( 'm'、 '∞'))))() '、' '、' '、' '、 ) ]) '。古いバージョンのPythonで並べ替えを続けるためにはタプルのリストが必要です – Anthon

+0

十分に私はすでに実装されている実装の大部分を楽しんでいました。既存のフィルタリングシステムに追加するのは非常に簡単です。 –

+0

次回あなたが立ち往生しているときに、あなたが持っているコードを質問に入れておけば、必要なものだけを正確に(そして唯一に)簡単に答えることができます。 – Anthon

関連する問題