Python 避免在PyYAML中引用

Python 避免在PyYAML中引用,python,yaml,Python,Yaml,我用YAML和PyYAML。在转储嵌套结构后,是否有方法避免*id002引用?为了便于阅读,我希望看到实际的(元组)值 在尝试生成一个小示例时,我注意到只有在使用相同的id对象时才会发生这种情况: import yaml t = ("b", "c") x = {(1, t):1, (2, t):2, } print(yaml.dump(x)) 所以我认为copy.copy()可以解决这个问题,但是对于元组它似乎不起作用:(我可以用不同的id创建一个新元组吗?PyYAML转储程序使用忽略别名方

我用YAML和PyYAML。在转储嵌套结构后,是否有方法避免*id002引用?为了便于阅读,我希望看到实际的(元组)值

在尝试生成一个小示例时,我注意到只有在使用相同的id对象时才会发生这种情况:

import yaml

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

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

PyYAML转储程序使用
忽略别名
方法来防止基本类型被“锚定”和“引用”通过这种方式。您可以重写该方法,以始终忽略与传入的任何对象无关的\u别名。默认情况下,
yaml.Loader
类用于
yaml.loade
中:

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\u flow\u style
参数以获得不同的输出布局

您无法使其工作的原因是representer与
id()
的结果相匹配,并且对于单独生成的两个元组,只要元素相同,就相同


我只是试过这个,我是作者,它是PyYAML的增强版,但对于这两个版本,应该是一样的。

适用于我的Python 2和Python 3,不需要monkeypatching:

导入yaml
类别NoAliasDumper(yaml.SafeDumper):
def忽略_别名(自身、数据):
返回真值
t=(“b”,“c”)
x={(1,t):1,(2,t):2,}
打印(yaml.dump(x,Dumper=NoAliasDumper))
产生

? - 1
  - [b, c]
: 1
? - 2
  - [b, c]
: 2

也许你可以显示代码,这样我们就可以用
x={(1,t):1,(2,tuple(t)):2}
?否:(不知何故
a=(1,);a是tuple(a)
也预测没有新的元组。啊,但是
tuple(list(t))
也可以工作:),如果你使用的是
yaml.safe\u dump()
从yaml中删除
?!!python/tuple
。您需要覆盖
yaml.SafeDumper.ignore_别名
。然后示例变成:
yaml.SafeDumper.ignore_别名=lambda*args:True
yaml.safe_dump(x,sys.stdout)
FWIW这正在工作(PyYAML 5.3.1)。在一些较新版本的PyYAML设置上,这导致了一个异常,至少在我的代码中是这样。谢谢!令人恼火的是,现在是2021年,最新的PyYAML版本仍然需要此技巧才能正常工作。@Rafaelaves,您的答案与yaml.safe_dump()不兼容调用我的主机。PyYAML必须是某个版本才能使代码工作吗?您提供的链接()中的答案对我很有用。对其他人来说,当您重写yaml.SafeDumper()类时,您必须使用yaml.dump()而不是yaml.safe\u dump()来摆脱yaml引用。使用yaml.safe\u dump()将导致以下错误:“TypeError:dump\u all”()为关键字参数“转储程序”获取了多个值