Hans Meine wrote:
On Sunday 18 July 2010 11:16:29 John Reid wrote:
I'm not sure what you mean by mix-in, but my first attempt involved
defining pickle suite getstate() and setstate() methods. I did not
define a getinitargs() method. Unfortunately when the derived object was
unpickled, __init__ was called with no arguments. As far as I can see
there's no way to use the boost.python pickle suite that does not
involve a call to __init__() on the unpickled object.
How should it work? A proper object of a BPL extension type needs a wrapped
C++ object "behind it". Thus, if you unpickle such an object, the
corresponding C++ object needs to be created.
There's the difference between pure python and BPL classes: with pure Python,
you (or the pickle module) may just assign __class__, restore all attributes
and be done. For C++ objects OTOH, pickle cannot list or restore the
attributes, or make sure that the object is in any defined state. So you
*need* to call a constructor, which may need arguments, hence the
getinitargs().
In the __reduce__ hack within your last mail, you explicitly call __init__
with a single self arg, relying on a default constructible class, and relying
on the fact that the C++ object will be in the same state as before. (That's
probably fine, since you originally wrote that you're dealing with interfaces
w/o state, but I wanted to point it out again for the unwary readers.)
Thanks for the clarification, that all makes sense.
I was hoping that I could make all the sub-classes picklable without
recoding a getinitargs() for each one. I think I've managed that by
using __reduce__(). I don't think I can do that using the boost.python
pickle suite.
I can see why you call my method a 'hack' but I think it is fine for my
purposes.
Thanks,
John.
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig