ruamel.yaml中yaml_set_comment_before_after_key的after参数失效问题
解决ruamel.yaml中yaml_set_comment_before_after_key后置注释失效问题
问题原因
ruamel.yaml的yaml_set_comment_before_after_key方法里,after参数是给目标key-value对之后的空白行添加注释。如果目标key的下一行直接是其他同级别key(比如你的代码里name后面紧跟着range),就没有可供添加注释的空白行,导致after参数的注释无法显示。
可行解决方案
方案1:给下一个key添加前置注释(推荐)
要在name和range之间插入注释,最直接的方式就是给range设置前置注释,完全符合你的期望输出:
import sys import ruamel.yaml from ruamel.yaml.comments import CommentedMap temp = CommentedMap() temp["id"] = "a" temp["name"] = "b" # 给name加前置注释 temp.yaml_set_comment_before_after_key('name', before="name: comment1", indent=2) # 给range加前置注释,实现name的"后置"效果 temp.yaml_set_comment_before_after_key('range', before="name: comment2", indent=2) temp["range"] = "c" temp_list = [temp] result = dict() result["test"] = temp_list yaml = ruamel.yaml.YAML() yaml.dump(result, sys.stdout)
输出结果:
test: - id: a # name: comment1 name: b # name: comment2 range: c
方案2:手动插入空白行和注释(不推荐)
如果一定要通过name的after参数实现,需要先在name后插入空白行再添加注释,但这种方式会引入不必要的空行,且不符合ruamel.yaml的注释管理逻辑:
import sys import ruamel.yaml from ruamel.yaml.comments import CommentedMap from ruamel.yaml.scalarstring import PlainScalarString temp = CommentedMap() temp["id"] = "a" temp["name"] = "b" temp.yaml_set_comment_before_after_key('name', before="name: comment1", indent=2) # 插入空白行并添加注释 temp.yaml_set_comment_before_after_key('name', after="name: comment2", after_indent=2) # 手动插入空行(需要调整内部结构,不推荐) temp.yaml_set_comment_after( temp.items()[temp.keys().index('name')], PlainScalarString(''), indent=2 ) temp["range"] = "c" temp_list = [temp] result = dict() result["test"] = temp_list yaml = ruamel.yaml.YAML() yaml.dump(result, sys.stdout)
这种方式的输出会带有空行,不符合你的期望格式,因此更推荐方案1。
内容的提问来源于stack exchange,提问作者Claire
相关产品推荐
相关产品推荐

