我已经阅读了许多线程,Python pickle/ cPickle不能pickle 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
Run Code Online (Sandbox Code Playgroud)
那么发生了什么?或者说,酸洗lambdas的限制是什么?
[编辑]我想我知道为什么这个代码运行.我忘了(抱歉!)我正在运行无堆栈python,它有一种称为tasklet执行函数的微线程形式.这些tasklet可以暂停,腌制,打开并继续,所以我猜(在无堆栈邮件列表上询问)它还提供了一种方法来挑选函数体.
我正在尝试腌制使用以下命令创建的嵌套字典:
collections.defaultdict(lambda: collections.defaultdict(int))
Run Code Online (Sandbox Code Playgroud)
我的简化代码是这样的:
class A:
def funA(self):
#create a dictionary and fill with values
dictionary = collections.defaultdict(lambda: collections.defaultdict(int))
...
#then pickle to save it
pickle.dump(dictionary, f)
Run Code Online (Sandbox Code Playgroud)
但是它给出了错误:
AttributeError: Can't pickle local object 'A.funA.<locals>.<lambda>'
Run Code Online (Sandbox Code Playgroud)
我打印字典后显示:
defaultdict(<function A.funA.<locals>.<lambda> at 0x7fd569dd07b8> {...}
Run Code Online (Sandbox Code Playgroud)
我尝试在该函数中使字典全局化,但错误是相同的。我很欣赏这个问题的任何解决方案或见解。谢谢!