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

如何配置ruamel.yaml以保留未使用的YAML锚点?

保留ruamel.yaml中转储未使用的YAML锚点

问题场景

原始YAML文件定义了两个锚点,但仅其中一个被引用:

anchors:
  kubernetes:
  - kubelet: &1GiKubeReserved
      kubeReserved:
        cpu: 80m
        memory: 1Gi
        pid: 20k
  - kubelet: &2GiKubeReserved
      kubeReserved:
        cpu: 160m
        memory: 2Gi
        pid: 20k
cluster:
  name: test
  kubernetes:
    kubelet:
      <<: *1GiKubeReserved

使用ruamel.yaml加载并转储该文件时,未被引用的2GiKubeReserved锚点会被自动移除,差异如下:

-  - kubelet: &2GiKubeReserved
+  - kubelet:

用户使用的Python代码片段:

from ruamel.yaml import YAML

yaml = YAML()
file = 'example.yaml'
with open(file, 'r+', encoding="utf-8") as f:
    data = yaml.load(f)
    f.seek(0)
    yaml.dump(data, f)
    f.truncate()

解决方案

ruamel.yaml默认会清理未被引用的锚点,只需在初始化YAML实例时开启preserve_anchors配置,即可保留所有锚点定义:

修改后的代码:

from ruamel.yaml import YAML

yaml = YAML()
yaml.preserve_anchors = True  # 保留所有锚点,包括未被引用的
yaml.indent(mapping=2, sequence=4, offset=2)  # 可选:对齐原始文件的缩进格式

file = 'example.yaml'
with open(file, 'r+', encoding="utf-8") as f:
    data = yaml.load(f)
    f.seek(0)
    yaml.dump(data, f)
    f.truncate()

说明

  • preserve_anchors=True是核心配置,它会让ruamel.yaml在加载时保留所有锚点的元数据,转储时原样输出,不会自动清理未被引用的锚点。
  • 缩进配置yaml.indent(...)用于匹配原始YAML文件的格式,避免转储后出现不必要的缩进差异,可根据实际文件格式调整参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:07:39