【问题标题】:Cannot pickle lambda function in python 3无法在 python 3 中腌制 lambda 函数
【发布时间】:2017-09-13 15:03:08
【问题描述】:

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

Python 3:

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

pickle.PicklingError: Can't pickle at 0x104e97840>: ma​​in 上的属性查找失败

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

【问题讨论】:

    标签: python python-3.x pickle dill


    【解决方案1】:

    我是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 编码为Cpickle.dumps2.x 版本是用 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.'
    

    我想尝试让C 表最终工作...

    【讨论】:

    • 我无法导入莳萝。我使用的是 python 3.6,我可以导入 pickle,但是当我导入 dill 时,我得到 module not found 错误
    • 其实我很快就谈过了。我点了安装莳萝,但我仍然收到模块未找到错误。
    • 检查您的pip 是否指向您尝试使用的同一python
    【解决方案2】:

    似乎在 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)
    

    【讨论】:

      猜你喜欢
      • 2014-10-10
      • 1970-01-01
      • 2018-11-15
      • 2020-04-07
      • 2017-08-14
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多