避免在PyYAML中引用

发布于 2021-01-29 16:58:51

我将YAML与PyYAML一起使用。有没有办法在转储嵌套结构后避免* id002引用?为了提高可读性,我想在那里查看实际的(元组)值。

在尝试生成一个迷你示例时,我注意到它仅在使用相同的id对象时发生:

import yaml

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

所以我认为copy.copy()可以解决问题,但是对于元组似乎不起作用:(我可以创建一个具有不同id的新元组吗?

关注者
0
被浏览
47
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    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.loadFalseTrue得到输出的不同布局。

    您无法使之起作用的原因是,表示符与的结果匹配,id()并且对于两个单独生成的元组,只要元素相同,则表示相同。


    ¹我只是使用ruamel.yaml尝试了这一点,我是作者ruamel.yaml,它是PyYAML的增强版本,但是对于这两者来说,它们应该相同。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看