我将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_style
到yaml.load
或False
上提供True
上的id()
参数,以获取输出的不同布局。您无法使它起作用的原因是,表示符与ojit_code的结果匹配,并且对于两个分别生成的元组,只要元素相同,则表示相同。
¹我只是使用ruamel.yaml尝试过此操作,我是作者ojit_a,它是PyYAML的增强版本,但是对于这两者,它们应该都可以正常工作。
关于python - 避免在PyYAML中引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13518819/