それは設計通りです。しかし、主にパッケージ作成者の怠惰の結果として、 ruamel.yamlの多くと同様に、十分に文書化されていません。
コメントは、マッピングの開始点に対する位置ではなく、キーに関連付けられています。YAML がトークン化される方法により、コメントは次のキーに関連付けられます。この結果、キーがなくなった場合でも、コメントは引き続き使用できますが、発行されなくなります。
これの副作用は、次の場合です。
import sys
import ruamel.yaml
yaml_str = """\
toplevel:
#comment1
hello: gut
#comment2
howdy: gut #horizontalcomment
#comment3
#comment4
gets: gut
#comment5
"""
data = ruamel.yaml.round_trip_load(yaml_str)
del data['toplevel']['gets']
ruamel.yaml.round_trip_dump(data, sys.stdout)
あなたはあなたoutput_str
のを取得し、それに従うと:
data['toplevel']['gets'] = 42
ruamel.yaml.round_trip_dump(data, sys.stdout)
あなたが得るでしょう:
toplevel:
#comment1
hello: gut
#comment2
howdy: gut #horizontalcomment
#comment3
#comment4
gets: 42
#comment5
そのため、コメントは「魔法のように」再表示されます。
ネストされたマッピングの最後にコメントを移動したい場合 (キー 'toplevel' を使用)、次のように実行できます。
comment_tokens = data['toplevel'].ca.items['gets'][1]
del data['toplevel'].ca.items['gets'] # not strictly necessary
data['toplevel'].ca.end = comment_tokens
そしてあなたは得るでしょう:
toplevel:
#comment1
hello: gut
#comment2
howdy: gut #horizontalcomment
#comment3
#comment4
#comment5
これはおそらく、最初に期待したものです。
exec()
直接使用するのではなく、なぜ使用するのか疑問に思います。
del yml['toplevel']['gets']