通过 dill 序列化带有全局变量的 Python 方法

Han*_* Yu 0 python serialization pickle dill

这是一个示例代码,其中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()
Run Code Online (Sandbox Code Playgroud)

在相关问题中:

最实用的解决方案是使用cloudpickle. 但似乎dill比 更强大cloudpickle。所以我想坚持使用dill或其他成熟的腌制器。

如果有必要的话,我不介意dill自己修改一些代码。

感谢您提前提供任何帮助:)

Mik*_*rns 6

我是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
>>> 
Run Code Online (Sandbox Code Playgroud)

dill提供了多种设置,为您提供序列化变体。如果您想始终使用此设置,则可以执行以下操作:

>>> dill.settings['recurse'] = True
Run Code Online (Sandbox Code Playgroud)