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