+-

我使用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方法来防止基本类型以这种方式“锚定”和“引用”.您可以将该方法重写为始终ignore_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
这样你就不必尽力而为,并使用相同的哈希来获得看起来不同的元组.您可能希望将yaml.load上的default_flow_style参数提供为False或True,以获得不同的输出布局.
您无法使其工作的原因是,表示者匹配id()的结果,并且只要元素相同,两个元组的生成就是相同的.
¹我只用ruamel.yaml尝试了这个,其中我是作者,它是PyYAML的增强版本,但为此,两者应该相同.
点击查看更多相关文章
转载注明原文:python – 避免在PyYAML中引用 - 乐贴网