Thanks for your replies.
The code I showed above was pyrex code, not python code. You are
correct that python objects do not require .__reduce__() to be
picklable, but apparently c extension types do (makes sense, they must
be more opaque to the python machinery).
I'll try the .__newobj__(), see if I can get it to do what I want...
On Apr 17, 2:50 am, Ziga Seilnacht [EMAIL PROTECTED] wrote:
dgdev wrote:
I would like topicklean extension type (written inpyrex). I have
it working thus far by defining three methods:
class C:
# for pickling
__getstate__(self):
... # make 'state_obj'
return state_obj
__reduce__(self):
return C,(args,to,__init__),me.__getstate__()
# for unpickling
__setstate__(self,state_obj):
self.x=state_obj.x
...
This gets the class pickling and unpickling.
However, I'd like to not specify arguments for __init__ (as I do now
in __reduce__), and so not have __init__ invoked during unpickling.
I would like to have the pickling machinery somehow create an
uninitialized object, and then call its __setstate__, where I can re-
create it from 'state_obj'.
Is there a kosher way to do so, that is without me having to have a
special mode in the constructor for when the object is being created
by the unpickler?
Why are you overwriting the __reduce__() method? The default
object.__reduce__() method, inherited by all new style classes,
already does what you want. If you really must overwrite it, and
you don't want __init__() to get called, then you should return a
reconstructor named __newobj__() as the first item of reduce
tuple. Something like this:
def __newobj__(cls, *args):
... return cls.__new__(cls, *args)
... class C(object):
... def __init__(self):
... print I shouldn't be called at reconstruction
... def __reduce__(self):
... try:
... getnewargs = self.__getnewargs__
... except AttributeError:
... newargs = (self.__class__,)
... else:
... newargs = (self.__class__,) + getnewargs()
... try:
... getstate = self.__getstate__
... except AttributeError:
... # this ignores __slots__ complications
... state = self.__dict__
... else:
... state = getstate()
... # this ignores list and dict subclasses
... return __newobj__, newargs, state
... c = C()
I shouldn't be called at reconstruction importpickle
for proto in range(3):
... assert isinstance(pickle.loads(pickle.dumps(c, proto)), C)
...
Ziga
--
http://mail.python.org/mailman/listinfo/python-list