2017-04-21 3 views
1

J'utilise cornichon sur python 2.7. J'essaye d'appeler les deux méthodes __getstate__ et __getnewargs__ que j'ai outrepassées. Je ne peux pas décaper l'attribut c car il s'agit d'une instance de classe D.Pickle: en utilisant à la fois __getstate__ et __getnewargs__

nn = C(7, 2) 
nn.d = 1 
pickle.dump(nn, open('c_save.p', 'wb')) 
nn2 = pickle.load(open('c_save.p', 'rb')) 
print nn2.__dict__ 

Retours:

getstate was called 
setstate was called 
{'a': 7, 'b': 2, 'd': 1} 

Je ne vois pas les appels de __getnewargs__ qui ont créé Sould attribut c.

Mon code:

import pickle 

class D(object): 
    def __init__(self, i, j): 
     self.i = i 
     self.j = j 

class C(object): 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 
     self.c = D(a, b) 
     self.d = 0 

    def __getstate__(self): 
     print 'getstate was called' 
     odict = self.__dict__.copy() 
     del odict['c'] 
     return odict 

    def __getnewargs__(self): 
     print 'getnewargs was called' 
     return (self.b,self.a) 

    def __setstate__(self, dict): 
     print 'setstate was called' 
     self.__dict__.update(dict) 

Répondre

0

De l'docs:

méthode de nouveaux types de style peuvent fournir une getnewargs() qui est utilisé pour protocole 2.

Et pour pickle.dump:

Si le paramètre de protocole est omis, le protocole 0 est utilisé.

Par conséquent, vous devrez définir explicitement le protocole de cornichon à 2 comme ceci:

pickle.dump(nn, open('c_save.p', 'wb'), protocol=2) 
+0

Merci! Fonctionne parfaitement. Elle retourne comme prévu 'getnewargs était called' ' getstate a called' 'setstate était called' ' { 'a': 7, 'c': <__ principal __ objet D à 0x7fd1bd8c1710.>, 'B': 2, 'd': 1} ' – JulesKzl