Python 避免在PyYAML中引用
我用YAML和PyYAML。在转储嵌套结构后,是否有方法避免*id002引用?为了便于阅读,我希望看到实际的(元组)值 在尝试生成一个小示例时,我注意到只有在使用相同的id对象时才会发生这种情况: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转储程序使用忽略别名方
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”()为关键字参数“转储程序”获取了多个值