不能在python 3中腌制lambda函数

raj*_*jat 4 python pickle python-3.x dill

使用dilllambda函数的pickle在Python 2中运行良好,但在Python 3中没有,有没有其他选择?

Python 3:

import dill 
import pickle
pickle.dumps(lambda x: x**2)
Run Code Online (Sandbox Code Playgroud)

pickle.PicklingError:无法在0x104e97840处进行pickle>:主要属性查找失败

Python 2.7:

import dill
import pickle
pickle.dumps(lambda x: x**2)
Run Code Online (Sandbox Code Playgroud)

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.

Mik*_*rns 11

我是dill作者.

你可以dillpython3不使用的情况下使用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.'
Run Code Online (Sandbox Code Playgroud)

你会注意到的_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一个,而不是C一个.所以,在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.'
Run Code Online (Sandbox Code Playgroud)

我想C最终让桌子工作......


Håk*_*Lid 5

好像在python 2中一样,pickle当您导入时,莳萝将被替换。在python 3中,您必须直接使用莳萝。

这适用于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.'
Run Code Online (Sandbox Code Playgroud)

另外,您也可以 import dill as pickle

>>> import dill as pickle 
>>> pickle.dumps(lambda x: x**2)
Run Code Online (Sandbox Code Playgroud)