避免在PyYAML中引用
我将YAML与PyYAML一起使用。有没有办法在转储嵌套结构后避免* id002引用?为了提高可读性,我想在那里查看实际的(元组)值。
在尝试生成一个迷你示例时,我注意到它仅在使用相同的id对象时发生:
import yaml
t = ("b", "c")
x = {(1, t):1, (2, t):2, }
print(yaml.dump(x))
所以我认为copy.copy()
可以解决问题,但是对于元组似乎不起作用:(我可以创建一个具有不同id的新元组吗?
-
PyYAML转储程序使用一种
ignore_aliases
方法来防止原始类型以这种方式“锚定”和“引用”。您可以重写该方法,以始终忽略传入的任何对象而忽略_aliases。默认情况下,yaml.Loader
该类在yaml.load
¹中使用:t = ("b", "c") x = {(1, t):1, (2, t):2, } yaml.Dumper.ignore_aliases = lambda *args : True yaml.dump(x, sys.stdout)
将为您提供:
? !!python/tuple - 1 - !!python/tuple [b, c] : 1 ? !!python/tuple - 2 - !!python/tuple [b, c] : 2
这样,您就不必尽力而为,使用具有相同哈希值的元组来看起来就不同了。你可能想提供
default_flow_style
参数上yaml.load
以False
或True
得到输出的不同布局。您无法使之起作用的原因是,表示符与的结果匹配,
id()
并且对于两个单独生成的元组,只要元素相同,则表示相同。
¹我只是使用ruamel.yaml尝试了这一点,我是作者ruamel.yaml,它是PyYAML的增强版本,但是对于这两者来说,它们应该相同。