0

元の YAML ファイルは

toplevel:
  #comment1
  hello: gut
  #comment2
  howdy: gut #horizontalcomment
  #comment3
  #comment4
  gets: gut
  #comment5

pythonで、私はやった

yml = ruamel.yaml.round_trip_load(yaml_input_str)
exec("del yml['toplevel']['gets']")
output_str = ruamel.yaml.round_trip_dump(yml)

output_str は次のようになります

toplevel:
  #comment1
  hello: gut
  #comment2
  howdy: gut #horizontalcomment
  #comment5

そして、コメント 3 とコメント 4 が消えます。これは設計どおりですか、それともバグですか?

4

1 に答える 1

0

それは設計通りです。しかし、主にパッケージ作成者の怠惰の結果として、 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']
于 2016-11-29T19:39:50.693 に答える