You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 12:34:59