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
相关产品推荐
相关产品推荐

