我已经读过许多线程,它们表明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

07-24 09:32