ruamel.yaml高版本无法导出行尾及键前后注释问题咨询
问题结论与解决方案
这确实是ruamel.yaml在2021年4月发布的0.17.5版本及之后引入的兼容性问题,属于注释处理逻辑变更导致的行为异常——0.17.4是最后一个能按你原有代码逻辑正常输出所有注释的版本。
问题原因
从0.17.5版本开始,ruamel.yaml对CommentedMap的注释关联逻辑做了调整:
- 原有的
yaml_set_comment_before_after_key()方法的indent参数处理方式改变,传入0会导致注释无法被正确关联到对应键; yaml_add_eol_comment()的column=0参数在高版本中被视为无效配置,行尾注释不会被渲染。
解决方法
方法1:降级版本
直接将ruamel.yaml降级到0.17.4,原有代码无需修改即可正常工作:
pip install ruamel.yaml==0.17.4
方法2:适配高版本的注释写法
如果需要使用高版本(如0.17.32),可以调整注释添加的代码逻辑:
import ruamel.yaml data = ruamel.yaml.comments.CommentedMap() data['key'] = 'value' data.yaml_set_start_comment('Start comment', indent=0) # 手动设置键的前置注释 ca = data.ca # 注释格式为 [None, [注释Token], None, None] ca.items['key'] = [ None, [ruamel.yaml.CommentToken('# Before comment\n', line_col=(0, 0))], None, None ] # 添加行尾注释时省略column参数(或设置合理的列值) data.yaml_add_eol_comment('End-of-line comment', 'key') yaml_str = ruamel.yaml.dump(data, Dumper=ruamel.yaml.RoundTripDumper) print(yaml_str)
这段代码在ruamel.yaml 0.17.32中运行后,会输出你预期的结果:
# Start comment # Before comment key: value # End-of-line comment
内容的提问来源于stack exchange,提问作者PenguinDevs
相关产品推荐
相关产品推荐

