无法pickle python 3中的lambda函数

2024-10-02 02:25:50 发布

您现在位置:Python中文网/ 问答频道 /正文

使用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.


Tags: lambda函数importmaincanpicklepython3ns
2条回答

在python2中,dill在导入时会替换pickle。在python3中,您必须直接使用dill。在

这在python 3.5中适用:

>>> import dill 
>>> dill.dumps(lambda x: x**2)
b'\x80\x03cdill.dill\n_create_function\nq\x00(cdill.dill\n_load_type\nq\x01X\x08\x00\x00\x00CodeTypeq\x02\x85q\x03Rq\x04(K\x01K\x00K\x01K\x02KCC\x08|\x00\x00d\x01\x00\x13Sq\x05NK\x02\x86q\x06)X\x01\x00\x00\x00xq\x07\x85q\x08X\x07\x00\x00\x00<stdin>q\tX\x08\x00\x00\x00<lambda>q\nK\x01C\x00q\x0b))tq\x0cRq\rc__builtin__\n__main__\nh\nNN}q\x0etq\x0fRq\x10.'

或者您也可以import dill as pickle

^{pr2}$

我是dill的作者。在

您可以在python3中使用dill,而不直接使用dill。。。然而,它还不如python2中的好。在

>>> import dill
>>> import pickle
>>> pickle._dumps(lambda x:x*x)
b'\x80\x03cdill.dill\n_create_function\nq\x00(cdill.dill\n_load_type\nq\x01X\x08\x00\x00\x00CodeTypeq\x02\x85q\x03Rq\x04(K\x01K\x00K\x01K\x02KCC\x08|\x00\x00|\x00\x00\x14Sq\x05N\x85q\x06)X\x01\x00\x00\x00xq\x07\x85q\x08X\x07\x00\x00\x00<stdin>q\tX\x08\x00\x00\x00<lambda>q\nK\x01C\x00q\x0b))tq\x0cRq\rc__main__\n__dict__\nh\nNN}q\x0etq\x0fRq\x10.'

您将注意到_dumps。也许你觉得这很奇怪。它是。这是因为在python3中,pickle已与以前称为cPickle的模块合并。奇怪的是:

  1. import _pickle提供旧的cPickle模块
  2. import pickle提供了pickle模块,并将cPickle合并在一起
  3. pickle.dumps只是_pickle.dumps(即,它是cPickle
  4. pickle._dumps是旧的pickle.dumps函数

令人困惑?它的关键是:pickle.dumps被编码在C中。2.x版本的pickle.dumps是用python编写的,但是现在它被cPickle.dumps所取代。如果你想得到“旧”的版本,你可以。。。它是pickle._dumps。在

当您import dill时,dill会自动注册它知道如何序列化到pickle序列化表的所有对象python而不是{}。所以,在python3中,这意味着连接到pickle._dumps的那个。在

我建议直接使用dill.dumps。在

^{pr2}$

我想让C表最终正常工作。。。在

相关问题 更多 >

    热门问题