2012-02-23 6 views
1

Nouveau à python ... J'ai la clé de classe suivante, qui s'étend dict:Comment créer une classe en utilisant cornichon en persistant Python

class Key(dict): 

    def __init__(self): 
     self = { some dictionary stuff... } 

    def __getstate__(self): 
     state = self.__dict__.copy() 
     return state 

    def __setstate__(self, state): 
     self.__dict__.update(state) 

Je veux enregistrer une instance de la classe avec ses données en utilisant pickle.dump, puis récupérez les données en utilisant pickle.load. Je comprends que je suis supposé changer d'une manière ou d'une autre l'état et l'état du setstate, cependant, je ne suis pas tout à fait clair sur comment je suis censé faire cela ... toute aide serait grandement appréciée!

Répondre

3

J'ai écrit une sous-classe de dict qui fait ça ici. Il convertit fondamentalement l'état en un tuple de base, et le ramène à nouveau à unpickle.

Mais sachez que vous devez avoir le fichier source original disponible pour unpickle. Le pickling ne sauvegarde pas réellement la classe elle-même, seulement l'état de l'instance. Python aura besoin de la définition de classe d'origine pour recréer.

+0

C'est fantastique! Merci Keith! Cependant, j'obtiens toujours l'erreur suivante quand j'essaye d'obj = pickle.load alors improb.objectif: return super (Key, self) .__ getitem __ (nom) KeyError: 'self' –

+0

Si j'imprime obj je reçois l'étrange sortie Key ({}) au lieu de {} ... une idée de ce qui pourrait se passer ici? –

+0

ElfsRUs: Ce dernier est dû à la méthode __repr__- Keith l'a spécifiquement conçu pour ressembler à ça. Vous pouvez le remplacer par "return"% s "% (dict .__ repr __ (self),)' si vous voulez qu'il ressemble à {}. En ce qui concerne le premier problème, pourriez-vous poster le code que vous avez utilisé pour obtenir ce retraçage? –

Questions connexes