That's the way, yes. You did it. However, I would wrote __getstate__
like this, but that is just a matter of personal style:
def __getstate__(self):
return (self.inboundkey, self.inboundlinks, self.tags,
getattr(self, "__dict__", {})
On 5/28/08, Eric Jonas <[EMAIL PROTECTED]> wrote:
> My solution, which is currently working, was to :
>
>
> def __reduce__(self):
> return type(self), (), self.__getstate__()
>
> def __getstate__(self):
> if hasattr(self, "__dict__"):
> return (self.inboundkey, self.inboundlinks, self.tags,
> self.__dict__)
> else:
> return (self.inboundkey, self.inboundlinks, self.tags, {})
>
> def __setstate__(self, state):
> (self.inboundkey, self.inboundlinks, self.tags, tgtdict) =
> state
> for k, v in tgtdict.iteritems() :
> setattr(self, k, v)
>
>
> That is, if an object has a dict, take that dict and return it as an
> argument. Then when we unpickle just restore everything in that dict.
>
> I'd love to hear if someone has a better way, but this is working great
> right now. Thanks again to everyone who helped.
>
> ...Eric
>
>
>
> On Tue, 2008-05-27 at 20:45 -0300, Lisandro Dalcin wrote:
> > Tomorrow I'll give the details, but yes, you could return a dict from
> > __getstate__, and then in __setstate__ loop over the dict items and
> > calling setattr(self, key, value). Perhaps that's enough for you, give
> > a try!.
> >
> > On 5/27/08, Eric Jonas <[EMAIL PROTECTED]> wrote:
> > > _amazing_
> > >
> > > Thank you so much.
> > >
> > > So one final question regarding additional state in derived classes. To
> > > simplify I've written a new bit of code for test.py:
> > >
> > >
> > > class MyPairExtra(pair):
> > > def __init__(self, f=0, s=0):
> > > self.first = f
> > > self.second = s
> > > self.extra = 1234
> > > self.extra2 = 0
> > >
> > >
> > > p6 = MyPairExtra()
> > > p6.extra2 = 5678
> > >
> > > s6p2 = pkl.dumps(p6, 2)
> > >
> > > s6p2load = pkl.loads(s6p2)
> > > assert s6p2load.extra == 1234
> > > assert s6p2load.extra2 == 5678
> > >
> > > The last assertion currently fails. You'll note that the "extra"
> > > attribute is correctly recovered by the "extra2" attribute, which we set
> > > after construction to 5678, is not. Is there any way to pickle arbitrary
> > > extra object state?
> > >
> > > Thanks again,
> > >
> > > ...Eric
> > >
> > >
> > >
> > >
> > > On Tue, 2008-05-27 at 18:57 -0300, Lisandro Dalcin wrote:
> > > > Eric, please sorry for the confussion, I just had a bug in __reduce__
> > > > . Look at the new files attached, your last use case is included in
> > > > the test script.
> > > >
> > > > __reduce__ returns a 3-tuple: the fist item is the type object, with
> > > > pickle sees as a callable, the second is a tuple argument for that
> > > > callable, and the third is the state
> > > >
> > > > In general, if you implement __reduce__ like this
> > > >
> > > > def __reduce__(self):
> > > > return function, args, state
> > > >
> > > > the at un-pickle time, Python (2.5) does
> > > >
> > > > function, args, state = unpickle(stream)
> > > > newobj = function(*args)
> > > > newobj.__setstate__(state)
> > > >
> > > > and then 'newobj' is the final recoverd object.
> > > >
> > > > I hope I was clear enough. If you still want to need more complicated
> > > > stuff, please just keep coming. All this discussion will surelly help
> > > > in the future at the time Cython tries to implement something to
> > > > automatically manage all this beast.
> > > >
> > > >
> > > >
> > > >
> > > > On 5/27/08, Eric Jonas <[EMAIL PROTECTED]> wrote:
> > > > > To start with, this is awesome. Thank you so much!
> > > > >
> > > > > Next question: What if I want MyPair to have a zero-argument
> > > > > constructor? (Well, besides self, that is). If I do:
> > > > >
> > > > > class MyPair(pair):
> > > > > def __init__(self):
> > > > > pass
> > > > >
> > > > > then I get "TypeError: ('__init__() takes exactly 1 argument (3
> given)".
> > > > > Does this mean that derived types must always have constructors
> with the
> > > > > same number (or more) than their base type?
> > > > >
> > > > > Thanks,
> > > > >
> > > > > ...Eric
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > On Tue, 2008-05-27 at 15:47 -0300, Lisandro Dalcin wrote:
> > > > > > Well, I admit that the Python docs are a bit hard to follow, but
> let's
> > > > > > solve your issue. Look at the attached files,
> > > > > >
> > > > > > * mod.pyx: a simple 'cdef' class pair, like the C++ one
> > > > > > * test.py: a full test, all pickle protocols, includes
> subclassing
> > > > > > * cy2py: my lovely distutils based script for the process
> *.pyx->*.so
> > > > > > (no need of makefiles, improvements welcome!)
> > > > > > run like $ python cy2py mod.pyx . This way, you get mod.so.
> > > > > >
> > > > > > If you find this code useful, you can donate some dollars ...
> Just a
> > > > > > joke! But if you can make it a really good example, It would be
> great
> > > > > > to have this included in Cython docs, in order to help other
> doing
> > > > > > this, I just do not have the time.
> > > > > >
> > > > > > Enjoy!
> > > > > >
> > > > > >
> > > > > > On 5/27/08, Eric Jonas <[EMAIL PROTECTED]> wrote:
> > > > > > >
> > > > > > > > But there is definitelly better ways. You sould look at the
> docs of
> > > > > > > > pickle module, and particularly to the
> __getinitargs__/__getnewargs__
> > > > > > > > and the __getstate__/__setstate__ stuff. Iff I were to
> implement
> > > > > > > > pickle protocol, I would explicitely use that.
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > The python pickle docs, which I've been struggling to
> understand, seem
> > > > > > > to suggest that __reduce__ is necessary for all extensions,
> or to use
> > > > > > > the copy_reg module. But it seems that
> __getstate__/__setstate__ are not
> > > > > > > applicable for c-extensions. Is this correct?
> > > > > > >
> > > > > > > Thanks,
> > > > > > >
> > > > > > > ...Eric
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > _______________________________________________
> > > > > > > Cython-dev mailing list
> > > > > > > [email protected]
> > > > > > > http://codespeak.net/mailman/listinfo/cython-dev
> > > > > > >
> > > > > >
> > > > > >
> > > > > > _______________________________________________
> > > > > > Cython-dev mailing list
> > > > > > [email protected]
> > > > > > http://codespeak.net/mailman/listinfo/cython-dev
> > > > >
> > > > > _______________________________________________
> > > > > Cython-dev mailing list
> > > > > [email protected]
> > > > > http://codespeak.net/mailman/listinfo/cython-dev
> > > > >
> > > >
> > > >
> > > > _______________________________________________
> > > > Cython-dev mailing list
> > > > [email protected]
> > > > http://codespeak.net/mailman/listinfo/cython-dev
> > >
> > > _______________________________________________
> > > Cython-dev mailing list
> > > [email protected]
> > > http://codespeak.net/mailman/listinfo/cython-dev
> > >
> >
> >
>
> _______________________________________________
> Cython-dev mailing list
> [email protected]
> http://codespeak.net/mailman/listinfo/cython-dev
>
--
Lisandro Dalcín
---------------
Centro Internacional de Métodos Computacionales en Ingeniería (CIMEC)
Instituto de Desarrollo Tecnológico para la Industria Química (INTEC)
Consejo Nacional de Investigaciones Científicas y Técnicas (CONICET)
PTLC - Güemes 3450, (3000) Santa Fe, Argentina
Tel/Fax: +54-(0)342-451.1594
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev