2011-05-04 2 views
1

J'ai besoin d'effectuer un traitement sur les objets qui sont décapés juste avant que cela ne se produise. Plus précisément pour les instances de sous-classes d'une certaine classe de base, je voudrais que quelque chose de totalement différent soit décapé à la place et ensuite recréé au chargement. Je connais __getstate__ & __setstate__ mais c'est une approche très invasive. Ma compréhension est que ce sont des méthodes privées (commencer par double trait de soulignement: __), et en tant que tels sont soumis à la dénomination mangling. Par conséquent, cela me forcerait à redéfinir ces deux méthodes pour chaque classe que je veux soumettre à ce comportement non standard. De plus, je n'ai pas vraiment un contrôle total sur la hiérarchie de toutes les classes. Je me demandais s'il y a une sorte de façon brève d'accrocher dans le processus de décapage et d'appliquer ce genre de contrôle que __getstate__ et __setstate__ donnent mais sans avoir à modifier les classes décapées en tant que telles.Traverser le style de pickle de la hiérarchie des objets

Une note de côté pour les curieux. C'est un cas d'utilisation tiré d'un projet utilisant Django et Céleri. Les modèles Django sont soit invérifiables, soit peu pratiques et encombrants à décaper. Par conséquent, il est préférable de choisir des paires de valeurs ID + classe de modèle à la place. Cependant parfois ce n'est pas directement le modèle qui est décapé mais plutôt un dictionnaire de modèles, une liste de modèles, une liste de listes de modèles, vous l'appelez. Cela me force à écrire beaucoup de code de copier-coller que je n'aime vraiment pas. Un besoin de modèles de décapage vient lui-même de l'installation de Django-céleri, où les fonctions ainsi que leurs arguments d'appel sont programmés pour une exécution ultérieure. Malheureusement, parmi ces arguments, il y a généralement beaucoup de modèles mélangés dans une hiérarchie non triviale.

EDIT

J'ai une possibilité de spécifier un sérialiseur personnalisé à utiliser par Céleri, il est donc vraiment une question d'être en mesure de construire un sérialiseur légèrement modifié au-dessus de cornichon sans trop d'effort.

Répondre

2

Les seuls crochets supplémentaires qui sont liés sont réduire() et __reduce__ex()

http://docs.python.org/library/pickle.html

What is the difference between __reduce__ and __reduce_ex__?

Python: Ensuring my class gets pickled only with the latest protocol

Je ne sais pas si elles fournissent vraiment ce dont vous avez besoin particulier.

+0

Mais cela nécessite à nouveau que j'implémente des méthodes supplémentaires sur la classe dont les instances sont décapées. Donc, c'est encore une approche envahissante, ou est-ce que je me méprends? – julkiewicz

+0

Ensuite, vous n'avez pas d'autres options sur le niveau pickle ... case closed –

+0

bien vous pourriez créer une hiérarchie de classe et faire une classe de base ont ces méthodes supplémentaires et tout descendrait de cette classe de base au lieu de l'objet? – anijhaw

Questions connexes