我将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方法来防止原始类型以这种方式“ anchor 定”和“引用”。您可以重写该方法,以始终忽略传入的任何对象而忽略_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_styleyaml.loadFalse上提供True上的id()参数,以获取输出的不同布局。

您无法使它起作用的原因是,表示符与ojit_code的结果匹配,并且对于两个分别生成的元组,只要元素相同,则表示相同。

¹我只是使用ruamel.yaml尝试过此操作,我是作者ojit_a,它是PyYAML的增强版本,但是对于这两者,它们应该都可以正常工作。

关于python - 避免在PyYAML中引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13518819/

10-11 20:58