使用dill
对lambda函数的pickle在python2中可以很好地工作,但是在python3中不行,还有其他选择吗?在
Python 3:
import dill
import pickle
pickle.dumps(lambda x: x**2)
pickle.PicklingError: Can't pickle at 0x104e97840>: attribute lookup on main failed
Python 2.7:
^{pr2}$cdill.dill\n_create_function\np0\n(cdill.dill\n_load_type\np1\n(S'CodeType'\np2\ntp3\nRp4\n(I1\nI1\nI2\nI67\nS'|\x00\x00d\x01\x00\x13S'\np5\n(NI2\ntp6\n(t(S'x'\np7\ntp8\nS''\np9\nS''\np10\nI1\nS''\np11\n(t(ttp12\nRp13\nc__main__\n__dict__\ng10\nNN(dp14\ntp15\nRp16\n.
在python2中,dill在导入时会替换
pickle
。在python3中,您必须直接使用dill。在这在python 3.5中适用:
或者您也可以
^{pr2}$import dill as pickle
我是
dill
的作者。在您可以在
python3
中使用dill
,而不直接使用dill
。。。然而,它还不如python2
中的好。在您将注意到
_dumps
。也许你觉得这很奇怪。它是。这是因为在python3
中,pickle
已与以前称为cPickle
的模块合并。奇怪的是:import _pickle
提供旧的cPickle
模块import pickle
提供了pickle
模块,并将cPickle
合并在一起pickle.dumps
只是_pickle.dumps
(即,它是cPickle
)pickle._dumps
是旧的pickle.dumps
函数令人困惑?它的关键是:
pickle.dumps
被编码在C
中。2.x
版本的pickle.dumps
是用python编写的,但是现在它被cPickle.dumps
所取代。如果你想得到“旧”的版本,你可以。。。它是pickle._dumps
。在当您}。所以,在
import dill
时,dill
会自动注册它知道如何序列化到pickle
序列化表的所有对象python
而不是{python3
中,这意味着连接到pickle._dumps
的那个。在我建议直接使用
^{pr2}$dill.dumps
。在我想让
C
表最终正常工作。。。在相关问题 更多 >
编程相关推荐