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