避免在PyYAML引用(Avoid references in PyYAML)

2019-07-04 02:11发布

我用YAML与PyYAML。 有没有办法来避免倾倒嵌套结构后的* id002参考? 为了提高可读性,我想看到实际的(元组)值存在。

虽然试图制造我注意到,当我使用同一ID的对象,它只是发生在一个小例子:

import yaml

t = ("b", "c")
x = {(1, t):1, (2, t):2, }
print(yaml.dump(x))

因此,我认为copy.copy()可以解决这个问题,但是对于元组似乎并没有工作:(我可以创建一个不同的ID一个新的记录?

Answer 1:

所述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

你不必这样去尝试你最好的,并得到元组具有相同散列看起来不同。 你可能想提供default_flow_style的参数yaml.loadFalseTrue让输出的不同布局。

你不能得到这个工作的原因是,该申述的结果一致id()这是产生同样的两元组分别只要要素是相同的。


¹ 我只试过这种ruamel.yaml ,其中我的作者,这是PyYAML的增强版本,但对于这个都应该工作一样。



文章来源: Avoid references in PyYAML
标签: python yaml