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

使用ruamel.yaml读取YAML注释时e、f键注释缺失及获取方法咨询

问题1:为什么输出结果中没有展示键e和键f对应的注释内容?

ruamel.yaml 会将注释挂载到注释所属层级的映射/序列对象上,而非全部存放在顶层对象中。你示例里e、f是子映射d的子键,它们的注释存储在data['d'].ca.items中,你打印的是顶层data.ca.items,自然看不到这两个键的注释信息。

问题2:如何正确根据指定键获取对应注释?

你需要按照键的层级,逐层找到对应映射对象,再从该对象的ca.items中读取指定键对应的注释即可。

ruamel.yaml 中每个键对应ca.items里的列表四个位置分别为:

  • 索引0:该键之前的前置注释
  • 索引1:键值对同一行的行尾注释
  • 索引2:该键值对结束后、下一个键之前的后置注释
  • 索引3:如果该键对应的值是映射/序列类型,就是值内部的开头注释

你示例里# comment for e是e键值对的后置注释,对应索引2的位置,获取代码示例如下:

import ruamel.yaml

yaml_str = """\
# comments start
a: 52
# comment for a
b: 50
# comment for b
c: 50
# comment for c
d:
   # comment for d
   e: 60
   # comment for e
   f: 70
   # comment for f
"""

yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)

# 获取e的注释
d_map = data['d']
if 'e' in d_map.ca.items:
    e_comment = d_map.ca.items['e'][2].value.strip()
    print(e_comment) # 输出结果为 # comment for e

如果需要通用的按路径查询注释的方法,可以封装递归函数实现:

def get_comment_by_path(root, key_path):
    current = root
    # 遍历到目标键的父层级
    for key in key_path[:-1]:
        current = current[key]
    target_key = key_path[-1]
    if target_key not in current.ca.items:
        return None
    # 可根据注释实际位置调整索引值,这里默认取后置注释
    comment_token = current.ca.items[target_key][2]
    return comment_token.value.strip() if comment_token else None

# 测试调用
print(get_comment_by_path(data, ['d', 'e'])) # 输出 # comment for e
print(get_comment_by_path(data, ['a'])) # 输出 # comment for a

内容的提问来源于stack exchange,提问作者user2713498

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:18:01