【问题标题】:Serialize a Python method with global variables by dill通过 dill 使用全局变量序列化 Python 方法
【发布时间】:2018-11-16 17:47:37
【问题描述】:

这是一个示例代码,其中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。但似乎dillcloudpickle 更健壮。所以我想坚持dill 或其他成熟的pickler。

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

提前感谢您的帮助:)

【问题讨论】:

    标签: python serialization pickle dill


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-20
      相关资源
      最近更新 更多