下面是示例代码,其中FLAG
是全局变量。方法A.func
对我来说是一个黑匣子,因此我不知道它在序列化之前会调用FLAG
。
import dill as pickle
FLAG = 100
class A:
def func(self):
print FLAG * 10
a = A()
dump = pickle.dumps(a.func)
del FLAG
foo = pickle.loads(dump) <-- fail here "NameError: global name 'FLAG' is not defined"
foo()
相关问题:
最实用的解决方案是使用cloudpickle
。但是看来dill
比cloudpickle
更健壮。因此,我想坚持使用dill
或其他成熟的腌制者。
如果有必要,我不介意自己修改一些dill
代码。
感谢您的任何帮助:)
答案 0 :(得分:1)
我是dill
的作者。如果您使用recurse
设置(与cloudpickle
处理全局变量的方式非常相似),则它会起作用。
>>> import dill
>>> FLAG = 100
>>>
>>> class A:
... def func(self):
... return FLAG*10
...
>>> a = A()
>>> dump = dill.dumps(a.func, recurse=True)
>>> del FLAG
>>> foo = dill.loads(dump)
>>> foo()
1000
>>>
dill
提供了几种设置,可为您提供序列化变体。如果要始终使用此设置,则可以执行以下操作:
>>> dill.settings['recurse'] = True