[Chicago] problem with __getstate__

Massimo Di Pierro mdipierro at cs.depaul.edu
Sun May 18 21:15:39 CEST 2008


The fact is that I can use copy_reg for the class S and does not fix  
the problem. I can only fix the problem using copy_reg on the class A  
but only this simple toy example. I am still running into problems  
into more complex example although this should be straightforward. I  
guess the question is

why does __getstate__ behaves differently depending on the super  
classes but the super.__getstate__ is not called?

Massimo


On May 18, 2008, at 2:07 PM, Atul Varma wrote:

> Let me rephrase the first sentence of my last post: I don't think  
> the issue is inheritance of just *any* class, but specifically  
> inheritance of built-in types. :)
>
> - Atul
>
> On Sun, May 18, 2008 at 12:06 PM, Atul Varma <varmaa at gmail.com> wrote:
> I could be wrong, but I don't think the issue is inheritance--I  
> think it's actually because you're subclassing a built-in type,  
> which requires doing some special stuff with pickle (namely,  
> registering with copy_reg as you've done in your last email).
>
> If you use pickle instead of cPickle, you get a more informative  
> traceback; take a look at pickle.Pickler and notice how the  
> dispatch table, which appears to map types to serialization  
> functions, maps the dictionary type to Pickler.save_dict().  I  
> think that has something to do with it.
>
> Hope that helps...  I have to run so I can't look into this more  
> right now, but let me know if you'd like me to.
>
> - Atul
>
>
> On Sun, May 18, 2008 at 11:58 AM, Massimo Di Pierro  
> <mdipierro at cs.depaul.edu> wrote:
> Odd... this works instead...
>
> from cPickle import *
> import copy_reg
>
> class S(dict):
>    def __getattr__(self,key): return self[key]
>
>    def __setattr__(self, key, value): self[key]=value
>
> class A(S):
>    def __init__(self): self.i=lambda u: u
>    #def __getstate__(self): return {}
>
> def unserialize_A(d):
>    return A()
>
> def serialize_A(o):
>    return unserialize_A, ({},)
>
> copy_reg.pickle(A, serialize_A)
>
> a=A()
> print a.i(3)
> x=dumps(a)
> b=loads(x)
> print b.i(4)
>
> I guess the rule is use copy_reg and not __getstate__ if you have  
> inheritance.
>
>
>
> On May 18, 2008, at 1:44 PM, Massimo Di Pierro wrote:
>
> does anybody know why the following code does not work?
>
>     from cPickle import *
>
>     class S(dict):
>         def __setattr__(self, key, value): self[key]=value
>     class A(S):
>        def __init__(self): self.i=lambda u: u
>        def __getstate__(self): return {}
>
>     a=A()
>     x=dumps(a)
>
> I know that self.i is a lambda and thus not pickable but __getstate__
> is called (I checked) and thus it should not matter. I guess I do not
> undretansd how pickling under inheritance.
>
> Massimo
> _______________________________________________
> Chicago mailing list
> Chicago at python.org
> http://mail.python.org/mailman/listinfo/chicago
>
> _______________________________________________
> Chicago mailing list
> Chicago at python.org
> http://mail.python.org/mailman/listinfo/chicago
>
>
> <ATT00001.txt>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/chicago/attachments/20080518/30ed00ef/attachment-0001.htm>


More information about the Chicago mailing list