我不确定你到底想做什么,但你可以试试dill。Dill 可以序列化和反序列化 lambda,我相信它也适用于闭包内的 lambda。pickle API 是其 API 的一个子集。要使用它,只需“将莳萝作为泡菜进口”并开始您的业务腌制。
>>> import dill
>>> testme = lambda x: lambda y:x
>>> _testme = dill.loads(dill.dumps(testme))
>>> testme
<function <lambda> at 0x1d92530>
>>> _testme
<function <lambda> at 0x1d924f0>
>>>
>>> def complicated(a,b):
... def nested(x):
... return testme(x)(a) * b
... return nested
...
>>> _complicated = dill.loads(dill.dumps(complicated))
>>> complicated
<function complicated at 0x1d925b0>
>>> _complicated
<function complicated at 0x1d92570>
Dill 将它的类型注册到pickle
注册表中,因此如果您有一些使用的黑盒代码pickle
并且您无法真正编辑它,那么只需导入 dill 就可以神奇地使其工作而无需猴子修补第 3 方代码。或者,如果您希望通过网络将整个解释器会话作为“python 图像”发送,dill 也可以这样做。
>>> # continuing from above
>>> dill.dump_session('foobar.pkl')
>>>
>>> ^D
dude@sakurai>$ python
Python 2.7.5 (default, Sep 30 2013, 20:15:49)
[GCC 4.2.1 (Apple Inc. build 5566)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> dill.load_session('foobar.pkl')
>>> testme(4)
<function <lambda> at 0x1d924b0>
>>> testme(4)(5)
4
>>> dill.source.getsource(testme)
'testme = lambda x: lambda y:x\n'
您可以轻松地通过 ssh 将图像发送到另一台计算机,然后从您离开的地方开始,只要存在 pickle 的版本兼容性以及有关 python 更改和正在安装的东西的常见警告。如图所示,您还可以提取在前一个会话中定义的 lambda 的源。
Dill 还提供了一些很好的工具,可以帮助您了解在代码失败时导致酸洗失败的原因。