[英]Cannot pickle lambda function in python 3
使用dill
酸洗lambda函数在Python 2中运行良好,但在Python 3中没有,有没有其他选择?
Python 3:
import dill
import pickle
pickle.dumps(lambda x: x**2)
pickle.PicklingError:无法在0x104e97840处进行pickle>: 主要属性查找失败
Python 2.7:
import dill
import pickle
pickle.dumps(lambda x: x**2)
cdill.dill \\ n_create_function \\ NP0 \\ -N(cdill.dill \\ n_load_type \\ NP1 \\ -N(S'CodeType '\\ NP2 \\ ntp3 \\ nRp4 \\ n(I1 \\ NI1 \\ NI2 \\ nI67 \\纳秒' | \\ X00 \\ x00d \\ X01 \\ X00 \\ x13S '\\ NP5 \\ N(NI2 \\ ntp6 \\ N(叔(S'x' \\ NP7 \\ ntp8 \\纳秒 '' \\ NP9 \\纳秒 '' \\ NP10 \\ NI1 \\纳秒 '' \\ np11 \\ N(叔(ttp12 \\ nRp13 \\ nc__main __ \\ n__dict __ \\ NG10 \\ NNN(DP14 \\ ntp15 \\ nRp16 \\ n。
我是dill
作者。
您可以使用dill
在python3
不使用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
模块合并。 奇怪:
import _pickle
为您提供旧的cPickle
模块 import pickle
为你提供pickle
模块, cPickle
合并进来 pickle.dumps
只是_pickle.dumps
(即它是cPickle
) pickle._dumps
是旧的pickle.dumps
函数 混乱? 它的关键是: pickle.dumps
用C
编码。 pickle.dumps
的2.x
版本是用python编写的,但现在它已被cPickle.dumps
所取代。 如果你想进入“旧”版本,你可以......它是pickle._dumps
。
当你import dill
, dill
自动将它知道如何序列化的所有对象注册到pickle
序列化表 - python
one表,而不是C
one表。 所以,在python3
,这意味着连接到pickle._dumps
。
我建议直接使用dill.dumps
。
>>> dill.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__builtin__\n__main__\nh\nNN}q\x0etq\x0fRq\x10.'
我想尝试让C
表最终起作用......
好像在python 2中,dill在导入时会替换pickle
。 在python 3中,你必须直接使用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
>>> import dill as pickle
>>> pickle.dumps(lambda x: x**2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.