web-dev-qa-db-fra.com

Cas d'utilisation courants pour le cornichon dans Python

J'ai regardé la documentation pickle , mais je ne comprends pas où pickle est utile.

Quels sont les cas d'utilisation courants du cornichon?

125
satoru

Quelques utilisations que j'ai rencontrées:

1) enregistrer les données d'état d'un programme sur le disque afin qu'il puisse continuer là où il s'était arrêté au redémarrage (persistance)

2) envoi de données python sur une connexion TCP dans un système multicœur ou distribué (marshalling)

3) stockage des objets python dans une base de données

4) convertir un objet arbitraire python en chaîne afin qu'il puisse être utilisé comme clé de dictionnaire (par exemple pour la mise en cache et la mémorisation).

Il y a quelques problèmes avec le dernier - deux objets identiques peuvent être décapés et donner des chaînes différentes - ou même le même objet décapé deux fois peut avoir des représentations différentes. En effet, le cornichon peut inclure des informations de comptage de référence.

Pour souligner le commentaire de @ lunaryorn - vous ne devez jamais décaper une chaîne d'une source non fiable, car un cornichon soigneusement conçu pourrait exécuter du code arbitraire sur votre système. Par exemple, voir https://blog.nelhage.com/2011/03/exploiting-pickle/

55
Dave Kirby

Exemple aller-retour minimal ..

>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'

Edit: mais quant à la question des exemples réels de décapage, peut-être le utilisation la plus avancée du décapage ( il faudrait creuser assez profondément dans la source) est ZODB: http://svn.zope.org/

Sinon, PyPI en mentionne plusieurs: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

J'ai personnellement vu plusieurs exemples d'objets marinés envoyés sur le réseau comme un protocole de transfert réseau facile à utiliser.

10
Jacob Oscarson

Le décapage est absolument nécessaire pour le calcul distribué et parallèle.

Supposons que vous vouliez effectuer une réduction de carte parallèle avec multiprocessing (ou sur des nœuds de cluster avec pyina ), alors vous devez vous assurer que la fonction que vous souhaitez mapper sur les ressources parallèles décapera. S'il ne décapage pas, vous ne pouvez pas l'envoyer aux autres ressources sur un autre processus, ordinateur, etc. Voir aussi ici pour un bon exemple.

Pour ce faire, j'utilise aneth , qui peut sérialiser presque tout en python. Dill a également quelques bons outils pour vous aider à comprendre ce qui provoque l'échec de votre décapage lorsque votre code échoue.

Et, oui, les gens utilisent la cueillette pour enregistrer l'état d'un calcul, ou votre session ipython , ou autre chose.

7
Mike McKerns

Je l'ai utilisé dans l'un de mes projets. Si l'application a été interrompue pendant son fonctionnement (elle a effectué une longue tâche et a traité de nombreuses données), j'ai dû enregistrer la structure de données entière et la recharger après la relance de l'application. J'ai utilisé cPickle pour cela, car la vitesse était une chose cruciale et la taille des données était vraiment grande.

7
taskinoor

Pour le débutant (comme c'est le cas avec moi), il est vraiment difficile de comprendre pourquoi utiliser le cornichon en premier lieu lors de la lecture de la documentation officielle . C'est peut-être parce que les documents impliquent que vous connaissez déjà tout le but de la sérialisation. Ce n'est qu'après avoir lu la description générale de la sérialisation que j'ai compris la raison de ce module et ses cas d'utilisation courants. Des explications générales sur la sérialisation sans tenir compte d'un langage de programmation particulier peuvent également aider: https://stackoverflow.com/a/14482962/4383472 , Qu'est-ce que la sérialisation? , https://stackoverflow.com/a/3984483/4383472

4
Bad

Pickle est comme "Enregistrer sous .." et "Ouvrir .." pour vos structures de données et vos classes. Supposons que je souhaite enregistrer mes structures de données afin qu'elles soient persistantes entre les exécutions de programme.

Économie:

with open("save.p", "wb") as f:    
    pickle.dump(myStuff, f)        

Chargement:

try:
    with open("save.p", "rb") as f:
        myStuff = pickle.load(f)
except:
    myStuff = defaultdict(dict)

Maintenant, je n'ai plus à reconstruire myStuff à partir de zéro, et je peux simplement reprendre (le) là où je me suis arrêté.

3
spartan

Pour ajouter un exemple concret: L'outil de documentation Sphinx pour Python utilise pickle pour mettre en cache les documents analysés et les références croisées entre les documents, pour accélérer les versions ultérieures de la Documentation.

2
lunaryorn

Je peux vous dire les utilisations pour lesquelles je l'utilise et je l'ai vu utilisé pour:

  • Le profil du jeu enregistre
  • Les données de jeu sauvent comme des vies et la santé
  • Enregistrements antérieurs de nombres de chiffres entrés dans un programme

Ce sont ceux pour lesquels je l'utilise au moins

1
Austin Gummy

J'utilise le décapage lors de la mise au rebut sur le Web d'un site Web à ce moment-là, je veux stocker plus de 8 000k URL et je veux les traiter le plus rapidement possible, j'utilise donc le décapage car sa qualité de sortie est très élevée.

vous pouvez facilement accéder à l'URL et où vous arrêtez même la clé du répertoire de travail Word récupère également les détails de l'URL très rapidement pour reprendre le processus.

1
Divanshu Tak