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