私は、コメントを追加してからYAMLに変換したいデータ構造を持っています。* RoundTripLoader経由で*読み込まれていないデータ構造のコメントを生成していますか?
データ構造をYAMLとして出力し、RoundTripLoader
を使用して戻すことを避けたいと思います。
データ構造をruamel.yamlコメントインターフェイスをサポートするものに変換する方法はありますか?
私は、コメントを追加してからYAMLに変換したいデータ構造を持っています。* RoundTripLoader経由で*読み込まれていないデータ構造のコメントを生成していますか?
データ構造をYAMLとして出力し、RoundTripLoader
を使用して戻すことを避けたいと思います。
データ構造をruamel.yamlコメントインターフェイスをサポートするものに変換する方法はありますか?
方法はありますが、そのためのインターフェイスは安定しているとは限りません。 それゆえに、文書化の不足のために、あなたの期待される出力であるround_trip_loading()
の表記、またはそれの小さなサンプルを見てください。
特別なバージョンの構造化ノード(マッピングとシーケンス)の表現にコメントが付いていることに気づかなければなりません。 safe_load()
をPython dict
としてマッピングする場合、これはCommentedMap()
であり、シーケンスの場合はPython list
としてロードされます。これはCommentedSeq()
です。
これらのクラスは両方とも、キー/値ペアrespの後に行末コメントとして構造ノードの前に発生する可能性のあるコメントを保持する.ca
属性を持つことができます。アイテム、キー値のペアまたは項目間、およびノードの終わりにある行に表示されます。あなたはそれが(例えば、ルーチンcomment_prep()
によって自動的に/再帰的に行うことができる)上のコメント必要があり、あなたが持っている任意のdict
やlist
を変換して、コメントを付けるために、正しいポイントと方法を見つけるしなければならないことを意味
。 コメント操作ルーチンが安定していないので、変更があった場合に更新する場所を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`を作成することができ
( 'm'、 '∞'))))() '、' '、' '、' '、 ) ]) '。古いバージョンのPythonで並べ替えを続けるためにはタプルのリストが必要です – Anthon
十分に私はすでに実装されている実装の大部分を楽しんでいました。既存のフィルタリングシステムに追加するのは非常に簡単です。 –
次回あなたが立ち往生しているときに、あなたが持っているコードを質問に入れておけば、必要なものだけを正確に(そして唯一に)簡単に答えることができます。 – Anthon