【发布时间】:2015-09-18 16:15:53
【问题描述】:
我有一个类实例(称为case),在 Python 2.7.6 中,从 object 子类化。它有几种方法,但也存储了一堆数据。
我想腌制这个东西。但是,如果我尝试“只做”,则会出现错误:
import cPickle
saver = cPickle.Pickler(sfile)
saver.dump(case)
File "/usr/lib64/python2.7/copy_reg.py", line 70, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle function objects
但后来我意识到我可以毫无问题地腌制case.__dict__,但它的一个属性是类似类的实例!为什么我可以腌制那个而不腌制这个?所以我尝试了以下方法:
casedict = {'testcase1':case}
saver.dump(casedict)
<cPickle.Pickler object at 0x6fef398>
...所以:显然我不能腌制纯对象,但如果它是字典的一部分,我可以腌制它?有什么不同?我很难理解什么可以腌制,什么不能腌制,这让我非常困惑。
【问题讨论】:
-
(1) 您应该展示您的代码,以便其他人可以轻松提供帮助,以及 (2) 您可能想尝试
dill而不是cPickle。我敢打赌,使用dill将解决您的酸洗错误。大多数对象不能用cPickle腌制,但是dill可以腌制python中的大多数对象。 -
我正在使用的实际课程太大而无法放在这里,无论如何我都不允许展示它们。不过,我不知道哪个方面很重要。我设法用莳萝腌制了一个实例,而不是另一个(抱怨
Can't pickle <type 'numpy.int64'>: it's not the same object as numpy.int64),因为某些数字的所有实例都应该相同! => 我希望有人能告诉我在哪里看,例如为什么字典会腌制,但它的组件却不会,一开始 -
是的,这是一个已知问题,并且不起作用,因为
numpy.int64不是int……它是部分用 C 构建的类的实例……但更重要的是,numpy.int64在导入中有一些命名空间修改,dill无法回溯和解决。 -
这是否意味着如果我想腌制东西,我不能使用 numpy
ints?花车效果更好吗(我有很多)? -
好吧,我找到了一个解决方案,删除实例的一个属性(它是另一个类的实例),然后使用 dill 保存实例的字典(仍然无法在实例上工作) ,并将类更改为具有从字典中重建实例的功能。 ——我也无法重建原来的问题,所以这个问题现在有点没用了……我应该删除它吗?有标准流程吗?
标签: python-2.7 pickle