1

多数の YAML ファイルを解析する Python プログラムがあります。一部のファイルには、YAML ファイルをパーサーにロードするときに保存したいコメント、アンカー、参照、およびマージ キーが含まれています。ruamel.yaml以下を実行すると、これらの往復保存があるようです:

with open(yaml_file, "r") as f:
    yaml = f.read()
parsed_yaml = ruamel.yaml.load(yaml, ruamel.yaml.RoundTripLoader)
print ruamel.yaml.dump(parsed_yaml,Dumper=ruamel.yaml.RoundTripDumper)

yaml_fileコメントとマージキーを含めて、提示された元のファイルを印刷します。YAML が形式で解析されている間に、これらのコメントやその他のキーにアクセスできるかどうか疑問に思っていますOrderedDict。これらの YAML ファイルを中間タイプに変換する必要があるため、キー、アンカー、および参照をマージしgetsetコメントできるようにすることが最優先事項です。

4

1 に答える 1

2

はい、コメントなどにアクセスできます。マッピング (python dict) は のインスタンスにロードされ、CommentedMapシーケンス (python list) は のインスタンスにロードされますCommentedSeq。これらはordereddictおよびCommentedBase、それぞれのサブクラスです。のlistCommentedBase.

CommentedBaseには、コメント、マージ、アンカー、およびフロー スタイルの情報が添付されるいくつかの属性があります。また、いくつかのマップ/シーケンス固有のヘルパー関数に依存するこれらの値を設定/取得するいくつかのメソッドがあります。

import sys
from ruamel.yaml import YAML

yaml_str = """\
a: 1   # comment 1
b: 2
c: 3
d: 4
e: 5
"""

yaml = YAML()
data = yaml.load(yaml_str)
data.yaml_add_eol_comment('comment 2', key='c')
data.yaml_add_eol_comment('#  comment 3', key='e', column=8)
yaml.dump(data, sys.stdout)

あなたに与える:

a: 1   # comment 1
b: 2
c: 3   # comment 2
d: 4
e: 5    #  comment 3

その点に注意してください:

  • 開始列を指定しない場合、次の前のコメントの列が使用されます。
  • #コメント文字列がその文字の組み合わせで始まっていない場合は、先頭とスペースが挿入されます。
  • スカラーとコメントの間に少なくとも 1 つのスペースがあります。

主にライブラリ作成者の怠惰のために、インターフェースは十分に文書化されていません。コメントのテストとアンカーのテストを見て、いくつかの例を取得することをお勧めします。また、インタフェースは、キーと値の組み合わせだけでなく、キーへの EOL コメントの添付を許可するなど、属性コンテンツ レベルでいくつかの変更も必要とします。次の YAML は、期待どおり/正しくラウンドトリップしません。

abc:      # this is the key
    9989  # this is the value

ruamel.yamlしたがって、必要な機能を必ずラップして、下位互換性のない方法でインターフェイスが変更された場合に、変更を加えることができる単一のポイントがあるようにしてください。

于 2016-03-25T18:57:29.873 に答える