繁体   English   中英

不能在python 3中腌制lambda函数

[英]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作者。

您可以使用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.'

你会注意到_dumps 也许你觉得这很奇怪。 它是。 这是因为在python3pickle已经与以前被称为cPickle模块合并。 奇怪:

  1. import _pickle为您提供旧的cPickle模块
  2. import pickle为你提供pickle模块, cPickle合并进来
  3. pickle.dumps只是_pickle.dumps (即它是cPickle
  4. pickle._dumps是旧的pickle.dumps函数

混乱? 它的关键是: pickle.dumpsC编码。 pickle.dumps2.x版本是用python编写的,但现在它已被cPickle.dumps所取代。 如果你想进入“旧”版本,你可以......它是pickle._dumps

当你import dilldill自动将它知道如何序列化的所有对象注册到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM