[Tutor] setstate trouble when unpickling

Kent Johnson kent37 at tds.net
Fri Jan 25 12:56:44 CET 2008


Jeff Peery wrote:
> Hello,
>  
> I've got a fairly simple class instance that I'm pickling. I'm using 
> setstate to update the instance when I unpickle. Although the setstate 
> doesn't seem to be called upon unpickling... here's an example, if 
> anyone see's what I'm doing wrong, please let me know. Thanks!
>  
> so I say start out with this class:
>  
> class dog:
>     def __init__(self):
>         self.num_legs = 4
>  
> then I pickle the instance of:
> sparky = dog()
>  
> then I update my dog class to:
> class dog:
>     def __init__(self):
>         self.hair_color = 'brown'
>         self.num_legs = 4
>  
>     def __setstate__(self, d):
>         if 'hair_color' not in d:
>             d['hair_color'] = 'brown'
>         self.__dict__.update(d)
>         print 'did this work?'
>  
> Now when I unpickle the original pickled object sparky I would hope to 
> see 'did this work' and I would also hope that sparky would have updated 
> to have the attribute 'hair_color' but nothing of the sort happens. if 
> just unpickles sparky without updating the attributes as I was hoping.

Are you sure the unpickle program is getting the new definition of dog? 
Can you show more code and tell us how you are running it?

This does what you expect, when run in a single program:

import pickle

class dog:
     def __init__(self):
         self.num_legs = 4

sparky = dog()
p = pickle.dumps(sparky)

class dog:
     def __init__(self):
         self.hair_color = 'brown'
         self.num_legs = 4

     def __setstate__(self, d):
         if 'hair_color' not in d:
             d['hair_color'] = 'brown'
         self.__dict__.update(d)
         print 'did this work?'

sparky2 = pickle.loads(p)
print sparky2.hair_color


prints:
did this work?
brown

Kent


More information about the Tutor mailing list