Ruamel.yam并没有保留所有评论



原始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消失。这是设计的还是错误?

的设计。但是,正如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']

相关内容

  • 没有找到相关文章

最新更新