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

ruamel.yaml中CommentedMap.keys()是否保留插入顺序?

ruamel.yaml CommentedMap 键顺序问题解答
  • 核心结论:CommentedMap的keys()方法返回的键严格保留原YAML文件中的定义顺序,转换成列表后仍会维持该顺序。
  • 底层逻辑:ruamel.yaml的CommentedMap基于OrderedDict(兼容Python 3.7+原生dict的有序特性)实现,核心设计目标就是保留YAML文件的原始结构、键顺序及注释信息。

验证代码示例

from ruamel.yaml import YAML

# 模拟带注释的YAML内容
yaml_content = """settings:
  # 这是key2的注释
  key2: value2
  # 这是key1的注释
  key1: value1
"""

yaml = YAML()
data = yaml.load(yaml_content)
settings_map = data['settings']

# 转换为列表后保留原顺序
keys_list = list(settings_map.keys())
print(keys_list)  # 输出结果: ['key2', 'key1']

调整键顺序的实操方法

如果需要将key1调整到key2前面,有两种可靠方式:

  • 方法1:使用内置move_to_end方法
# 将key1移到CommentedMap的最前面
settings_map.move_to_end('key1', last=False)
  • 方法2:手动构建新的CommentedMap(适合复杂顺序调整)
from ruamel.yaml.comments import CommentedMap

new_settings = CommentedMap()
# 按指定顺序添加键,并同步迁移注释
new_settings['key1'] = settings_map['key1']
new_settings.yaml_set_comment_before_key('key1', settings_map.yaml_comment_before_key('key1'))

new_settings['key2'] = settings_map['key2']
new_settings.yaml_set_comment_before_key('key2', settings_map.yaml_comment_before_key('key2'))

# 替换原settings节点
data['settings'] = new_settings

# 写入调整后的YAML文件
yaml.dump(data, open('adjusted.yaml', 'w'))

注意:调整键顺序时必须同步处理注释,ruamel.yaml提供的yaml_set_comment_before_key、yaml_add_eol_comment等方法可确保注释完整保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:33:20