7

在 Python 2 中使用dilllambda 函数的酸洗可以正常工作,但在 Python 3 中却不行,有没有其他选择?

蟒蛇 3:

import dill 
import pickle
pickle.dumps(lambda x: x**2)

pickle.PicklingError: Can't pickle at 0x104e97840>: 在main上的属性查找失败

蟒蛇 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\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.

4

2 回答 2

13

我是dill作者。

您可以dillpython3dill直接使用的情况下使用...但是,它还没有现在那么好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. 也许你觉得这很奇怪。这是。这是因为 in 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 dilldill自动注册它知道如何序列化到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.'

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

于 2017-09-14T01:43:31.297 回答
8

好像在 python 2 中, dillpickle会在您导入时替换。在 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)
于 2017-09-13T15:24:52.420 回答