首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >序列化和反序列化lambdas

序列化和反序列化lambdas
EN

Stack Overflow用户
提问于 2012-08-09 07:02:44
回答 1查看 7.9K关注 0票数 17

我想在机器A上序列化,在机器B上反序列化,一个python。这有几个明显的问题:

  • 泡菜模块不序列化或反序列化代码。它只序列化类/方法/函数的名称。
  • 我在google中找到的一些答案建议使用低级封送处理模块来序列化lambda的func_code属性,但它们无法描述如何从反序列化的代码对象中重构函数对象。
  • marhshal(l.func_code)不会序列化与lambda相关的闭包,这会导致检测给定的lambda何时真正需要闭包的问题,并警告用户他试图序列化使用闭包的lambda。

因此,我的问题是:

  • 如何从反序列化(反序列化)代码对象重构函数?
  • 如果没有相关的闭包,如何检测给定的lambda无法正常工作?
EN

回答 1

Stack Overflow用户

发布于 2013-05-13 21:39:34

我不知道你到底想做什么,但你可以试试迪尔。Dill可以序列化和反序列化lambda,我相信在闭包中也适用于lambda。泡菜API是其API的一个子集。要使用它,只需“进口苦菜作为泡菜”,并进行您的业务泡菜的东西。

代码语言:javascript
复制
>>> 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就可以神奇地使其正常工作,而无需对第三方代码进行猴子操作。或者,如果您希望整个解释器会话以"python映像“的形式通过线路发送,dill也可以这样做。

代码语言:javascript
复制
>>> # 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发送到另一台计算机,并从您停留的位置开始,只要泡菜的版本兼容性,以及有关python更改和安装的常规警告。如图所示,还可以提取在上一次会话中定义的lambda的源。

Dill还提供了一些好工具,帮助您理解代码失败时是什么原因导致您的酸洗失败。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11878300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档