I have to save and load a cython class instance. My cython class is this plus several methods:
import numpy as np
cimport numpy as np
cimport cython
cdef
I don't know if you found it, but the official Python documentation has a section on pickling extension types (unfortunately there doesn't seem to be a Python 3 version of this doc, but it works the same in Python 3).
I think you have three problems here. Firstly, the function returned by __reduce__
is supposed to create a new object from scratch and return it, whereas your rebuild
function just sets some attributes. Secondly, the tuple returned by __reduce__
must itself be picklable, and as a method, Perceptron_avg_my.rebuild
is not picklable (I think this is expected to be fixed in python 3.3 or 3.4). Instead, you could turn it into a module-level function. Finally, the arguments (self.fpos,self.freePos)
are passed to rebuild
individually - you don't have to unpack the tuple yourself.
The following seems to work for me (though you probably want to store the values of the other attributes too, otherwise they will just have the initial values set by __init__
):
#inside the class definition
def __reduce__(self):
return (rebuild, (self.wlen, self.fpos, self.freePos))
#standalone function
def rebuild(wlen, fpos, freePos):
p = Perceptron_avg_my(wlen)
p.fpos = fpos
p.freePos = freePos
return p