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

PyYAML dump未生成相同对象锚点,如何实现预期引用效果?

PyYAML实现值的锚点引用

PyYAML默认不会为不可变类型(如int、str)自动生成锚点,只有可变类型(list、dict)才会默认处理,所以直接dump字典时不会得到预期的锚点输出。要实现锚点引用,需要重写Dumper的ignore_aliases方法:

方法1:对所有对象生成锚点

自定义Dumper类,让所有对象都不忽略锚点:

import yaml

class AliasDumper(yaml.Dumper):
    def ignore_aliases(self, data):
        return False

a = 25
dict_to_dump = {'a': a, 'b': a}
print(yaml.dump(dict_to_dump, Dumper=AliasDumper))

输出示例:

a: &id001 25
b: *id001

方法2:仅对特定值生成锚点

如果只想让指定的值生成锚点,可以在方法里添加判断逻辑:

import yaml

target_val = 25

class TargetAliasDumper(yaml.Dumper):
    def ignore_aliases(self, data):
        return data != target_val

dict_to_dump = {'a': target_val, 'b': target_val}
print(yaml.dump(dict_to_dump, Dumper=TargetAliasDumper))

原理说明

PyYAML默认Dumper的ignore_aliases方法对不可变类型返回True,即不生成锚点。重写该方法返回False(或针对特定值返回False),就能强制Dumper为对应对象生成锚点和引用标记。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:15:52