python - Pickle 转储引用模块的对象

标签 python module pickle

我想像这样pickle-dump一个对象:

import module_A
import module_B

class SomeClass(object):
  def __init__(self, the_module):
    self.module = the_module
    self.some_other_members = whatever

x = SomeClass(module_A)

这是不允许的,错误是我无法转储模块。在这种情况下,我对实际转储模块不感兴趣。然而,对象正在使用哪个模块很重要。所以我想转储模块的一些标识符,例如 __setstate__我可以指self.module到正确的模块。我应该使用什么样的标识符来 __setstate__我可以通过该标识符找到正确的模块吗?可能有许多可能的模块和类 SomeClass现在知道其中有哪些了。

更新:

抱歉,我们在使用 cPickle 时发现了错误消息。普通pickle没有这个问题,正如迈克提到的,dill也支持 pickle 模块。我使用的最终解决方案是此处给出的解决方案:https://mail.python.org/pipermail/python-ideas/2013-July/021959.html .

最佳答案

我认为您可以使用 dill 完成您想要的操作,它提供了比 pickle 更好的序列化。

>>> import dill
>>> import numpy
>>>
>>> import math
>>> 
>>> class SomeClass(object):
...   def __init__(self, module):
...     self.module = module
...     self.other = lambda x: numpy.arange(3)
... 
>>> # save the class instance
>>> x = SomeClass(math)
>>> _x = dill.dumps(x)
>>>
>>> # delete a bunch of stuff
>>> del SomeClass 
>>> del math
>>> import sys
>>> del sys.modules['math']
>>> del x
>>>
>>> # unpickle
>>> x = dill.loads(_x)
>>> x.module
>>> x.module.sin(x.other(0)[0])
0.0

关于python - Pickle 转储引用模块的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31953897/

相关文章:

python - 创建 celery 任务然后同步运行

python - 使用已弃用的 Numpy API

python - 如何使用 BeautifulSoup 检查关闭标签的总数?

Ruby - 包括两个模块,它们都有一个同名的子模块

java - 如何在Java中unpickle文件?

python - pymongo - 序列化/pickle 连接或数据库对象

python - Tensorflow 中的反向传播(通过时间)代码

python - 模块未找到错误: No module named 'bcolz'

module - 找不到名称 'Headers' 、 'RequestInit' 、 'Response'

Python - Pickle init 需要 4 个参数 - 给定 1 个