问题描述
我必须像这样腌制一组对象:
导入 cPickle 作为泡菜从 numpy 导入 sin、cos、arraytmp = lambda x: sin(x)+cos(x)测试 = 数组([[tmp,tmp],[tmp,tmp]],dtype=object)pickle.dump( test, open('test.lambda','w') )
它给出了以下错误:
TypeError: can't pickle function objects
有办法解决吗?
内置pickle模块无法序列化多种python对象(包括lambda函数、嵌套函数和命令行定义的函数).
picloud 包包含更强大的pickler,可以pickle lambda 函数.
from pickle import dumpsf = λ x: x * 5转储(f)# 错误从 cloud.serialization.cloudpickle 导入转储dumps(f) # 有效
PiCloud 序列化的对象可以使用普通的 pickle/cPickle load
和 loads
函数反序列化.
Dill 也提供类似的功能
>>>进口莳萝>>>f = λ 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\x00\x00x00\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\x00t\x08x00\x00<lambda>\x01\x00\x00\x00s\x00\x00\x00\x00q\x02\x85q\x03Rq\x04c__builtin__\n__main__\nU\x08<lambda>q\x08tR.'I have to pickle an array of objects like this:
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') )
and it gives the following error:
TypeError: can't pickle function objects
Is there a way around that?
The built-in pickle module is unable to serialize several kinds of python objects (including lambda functions, nested functions, and functions defined at the command line).
The picloud package includes a more robust pickler, that can pickle lambda functions.
from pickle import dumps
f = lambda x: x * 5
dumps(f) # error
from cloud.serialization.cloudpickle import dumps
dumps(f) # works
PiCloud-serialized objects can be de-serialized using the normal pickle/cPickle load
and loads
functions.
Dill also provides similar functionality
>>> 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、cPickle、酸洗 lambda 函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!