无法在 python 3 中腌制 lambda 函数
Cannot pickle lambda function in python 3
使用 dill
pickling lambda 函数在 Python 2 中工作正常,但在 Python 3 中不行,还有其他选择吗?
Python 3:
import dill
import pickle
pickle.dumps(lambda x: x**2)
pickle.PicklingError: Can't pickle at
0x104e97840>: attribute lookup on main failed
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 2 中一样,导入时莳萝会替换 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)
我是 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
的模块合并。奇怪的是:
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
取代。如果你想获得 "old" 版本,你可以...它是 pickle._dumps
.
当您 import dill
时,dill
会自动将所有它知道如何序列化的对象注册到 pickle
序列化 table -- 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
table 最终正常工作...
使用 dill
pickling lambda 函数在 Python 2 中工作正常,但在 Python 3 中不行,还有其他选择吗?
Python 3:
import dill
import pickle
pickle.dumps(lambda x: x**2)
pickle.PicklingError: Can't pickle at 0x104e97840>: attribute lookup on main failed
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 2 中一样,导入时莳萝会替换 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)
我是 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
的模块合并。奇怪的是:
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
取代。如果你想获得 "old" 版本,你可以...它是 pickle._dumps
.
当您 import dill
时,dill
会自动将所有它知道如何序列化的对象注册到 pickle
序列化 table -- 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
table 最终正常工作...