【发布时间】:2021-12-08 13:10:45
【问题描述】:
考虑以下python代码:
import cloudpickle
class Foo:
def __init__(self, num):
self.num = num
def outer(num):
return Foo(num)
print(cloudpickle.dumps(outer))
这会在您每次运行代码时产生不同的泡菜。使用 pickletools 分析 pickle 文件显示以下差异:
144c144
< 552: \x8c SHORT_BINUNICODE '2e3db4572bb349268962a75a8a6f034c'
---
> 552: \x8c SHORT_BINUNICODE '89ee770de9b745c4bbe83c353f1debba'
现在,我了解到 cloudpickle 不能保证 pickle 文件的确定性。 (link),但我很好奇为什么这两个泡菜文件不同。看起来上面的差异是因为 Foo 类的某种不同的哈希值。
请注意,我使用固定的PYTHONHASHSEED 运行 python 程序。
PS: 这足以重现问题:
import pickletools
import cloudpickle
class Foo:
def __init__(self, num):
self.num = num
pickletools.dis(cloudpickle.dumps(Foo))
所以似乎每个类都有一个属性,它被烘焙到 cloudpickle 中,但我不知道那个属性是什么。
【问题讨论】:
标签: python pickle cloudpickle