如何配置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
相关产品推荐
相关产品推荐

