当前位置: 首页 > 面试题库 >

Python,cPickle,酸洗lambda函数

卞安邦
2023-03-14
问题内容

我必须腌制这样的对象数组:

import cPickle as pickle
from numpy import sin, cos, array
tmp = lambda x: sin(x)+cos(x)
test = array([[tmp,tmp],[tmp,tmp]],dtype=object)
pickle.dump( test, open('test.lambda','w') )

它给出了以下错误:

TypeError: can't pickle function objects

有办法解决吗?


问题答案:

内置的pickle模块无法序列化几种python对象(包括lambda函数,嵌套函数和在命令行中定义的函数)。

picloud软件包包括一个更强大的pickler,可以对lambda函数进行pickle。

from pickle import dumps
f = lambda x: x * 5
dumps(f) # error
from cloud.serialization.cloudpickle import dumps
dumps(f) # works

可以使用常规的pickle / cPickleloadloads功能来反序列化PiCloud序列化的对象。

莳萝还提供类似的功能

>>> import dill           
>>> f = lambda x: x * 5
>>> dill.dumps(f)
'\x80\x02cdill.dill\n_create_function\nq\x00(cdill.dill\n_unmarshal\nq\x01Uec\x01\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00C\x00\x00\x00s\x08\x00\x00\x00|\x00\x00d\x01\x00\x14S(\x02\x00\x00\x00Ni\x05\x00\x00\x00(\x00\x00\x00\x00(\x01\x00\x00\x00t\x01\x00\x00\x00x(\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00<stdin>t\x08\x00\x00\x00<lambda>\x01\x00\x00\x00s\x00\x00\x00\x00q\x02\x85q\x03Rq\x04c__builtin__\n__main__\nU\x08<lambda>q\x05NN}q\x06tq\x07Rq\x08.'


 类似资料:
  • 问题内容: 我想搜索给定目录中所有图像中的冲浪,并保存它们的关键点和描述符以供将来使用。我决定使用泡菜,如下所示: 当我尝试执行时,出现以下错误: 有人知道吗,这是什么意思,以及如何解决?我正在使用Python 2.6和Opencv 2.3.1 十分感谢 问题答案: 问题是您不能将cv2.KeyPoint转储到pickle文件中。我遇到了同样的问题,并设法通过本质上对关键点进行序列化和反序列化来解

  • 问题内容: 我有一个类,该类的实例需要按照用户的指示格式化输出。有一种默认格式,可以覆盖。我是这样实现的: 可以吗 让我知道是否有更好的方法来进行设计。 不幸的是,我需要腌制此类的实例。但是只有在模块顶层定义的功能才能被酸洗。函数是不可拾取的,因此我的instance属性破坏了酸洗。 我尝试重写此代码以使用类方法而不是lambda函数,但由于相同的原因仍然没有运气: 请注意,即使不覆盖默认值,此处

  • 问题内容: 我最近更改了程序的目录布局:以前,我的所有模块都位于“主”文件夹中。现在,我将它们移动到以该程序命名的目录中,并在其中放置一个包。 现在,我的主目录中只有一个.py文件,用于启动程序,这更加整洁。 无论如何,尝试从程序的早期版本中加载腌制文件失败。我收到“ ImportError:没有名为工具的模块”的信息- 我猜是因为我的模块以前位于主文件夹中,而现在位于whyteboard.too

  • 问题内容: 这可能很愚蠢,但我无法使用python 3.5 docker image 安装 Docker文件 requirements.txt 当我尝试构建图像时 问题答案: 带有标准库…在python 2.x中。您使用的是python 3.x,因此,如果需要,您可以执行以下操作: 但是,在3.x中,仅使用会更容易。 无需安装任何东西。如果python 3.x 需要某些东西,那可能是一个错误。

  • 有时您可能只需要在程序中的一个位置使用一个函数,并且该函数非常简单,您可能不会给它命名,或者可能不想将它存储在符号表中,而宁愿编写一个未命名或匿名的函数。 LISP允许您编写仅在程序中遇到它们时才计算的匿名函数。 这些函数称为Lambda functions. 您可以使用lambda表达式创建此类函数。 lambda表达式的语法如下 - (lambda (parameters) body) 无法

  • 模块:pickle 和 cPickle 目的: Python对象序列化 python版本:pickle至少1.4, cPickle 至少1.5 Python对象序列化 描述 pickle模块可以实现任意的Python对象转换为一系列字节(即序列化对象)的算法. 这些字节流可以被传输或存储, 接着也可以重构为一个和原先对象具有相同特征的新对象. cPickle模块实现了同样的算法, 但它是用c而不是