ruamel.yam没有保留所有评论

时间:2016-11-29 17:25:20

标签: ruamel.yaml

原始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

并且comment3和comment4消失。这是设计还是错误?

1 个答案:

答案 0 :(得分: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']