我已经读过许多线程,它们表明Python pickle
/ cPickle
无法使lambda函数失效。但是,以下代码使用Python 2.7.6可以工作:
import cPickle as pickle
if __name__ == "__main__":
s = pickle.dumps(lambda x, y: x+y)
f = pickle.loads(s)
assert f(3,4) == 7
那么发生了什么?或者,腌制lambda的极限是多少?
[编辑]
我想我知道为什么这段代码运行。我忘了(对不起!)我正在运行无堆栈python,它具有一种称为tasklet的微线程形式,可以执行一个功能。这些tasklet可以暂停,腌制,未腌制和继续进行,因此,我猜(在无堆栈邮件列表中询问),它还提供了一种腌制函数体的方法。
最佳答案
是的,python可以腌制lambda函数……但是只有当您使用copy_reg
注册来腌制lambda函数的方式时,python才能腌制lambda函数-当dill
时,copy_reg
包会为您将所需的import dill
加载到pickle注册表中。Python 2.7.8 (default, Jul 13 2014, 02:29:54)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import dill # the code below will fail without this line
>>>
>>> import pickle
>>> s = pickle.dumps(lambda x, y: x+y)
>>> f = pickle.loads(s)
>>> assert f(3,4) == 7
>>> f
<function <lambda> at 0x10aebdaa0>
在此处获取莳萝:https://github.com/uqfoundation