为什么ruamel.yaml自动生成锚点和别名?如何禁用该功能?
问题原因
ruamel.yaml默认会检测代码中重复引用的同一个对象,自动生成锚点和别名来压缩输出内容。你代码中所有port_dict的networkType字段都指向了同一个sriov_seg_type列表对象,因此被识别为重复引用,触发了锚点别名生成逻辑。
方案1:全局关闭锚点别名生成
直接配置ruamel.yaml的representer忽略所有别名生成规则,不需要修改业务逻辑代码:
import ruamel.yaml from collections import OrderedDict # 初始化YAML实例 yaml = ruamel.yaml.YAML() # 核心配置:忽略所有别名生成规则 yaml.representer.ignore_aliases = lambda *args: True # 可选配置:调整缩进对齐你期望的输出格式 yaml.indent(mapping=2, sequence=4, offset=2) sriov_port = ["P1", "P2", "P3", "P4"] sriov_seg_type = ["flat"] res = [] for port in sriov_port: port_dict = OrderedDict() port_dict["name"] = port port_dict["mtu"] = 9000 port_dict["networkType"] = sriov_seg_type res.append(port_dict) # 输出结果 yaml.dump(res, open("output.yaml", "w", encoding="utf-8"))
方案2:从引用层面避免重复对象
每次给networkType赋值时使用新的列表对象,ruamel.yaml不会识别为重复引用,自然不会生成锚点:
sriov_seg_type = ["flat"] for port in sriov_port: port_dict = OrderedDict() port_dict["name"] = port port_dict["mtu"] = 9000 # 每次赋值都创建新的列表副本,避免同一个对象被多次引用 port_dict["networkType"] = sriov_seg_type.copy()
两种方案都可以达到你需要的输出效果:如果只需要在当前字段避免锚点生成,选择方案2即可;如果需要整个YAML输出都不出现任何锚点别名,选择方案1更方便。
内容的提问来源于stack exchange,提问作者Claire
相关产品推荐
相关产品推荐

