Risposte:
Alcuni usi che ho riscontrato:
1) salvataggio dei dati di stato di un programma su disco in modo che possa continuare da dove era stato interrotto al riavvio (persistenza)
2) invio di dati Python su una connessione TCP in un sistema multi-core o distribuito (marshalling)
3) memorizzazione di oggetti Python in un database
4) convertire un oggetto Python arbitrario in una stringa in modo che possa essere utilizzato come chiave di dizionario (ad es. Per memorizzazione nella cache e memoization).
Ci sono alcuni problemi con l'ultimo - due oggetti identici possono essere decapati e comportare stringhe diverse - o anche lo stesso oggetto decapato due volte può avere rappresentazioni diverse. Questo perché il pickle può includere informazioni sul conteggio dei riferimenti.
Per enfatizzare il commento di @ lunaryorn - non dovresti mai estrarre una stringa da una fonte non attendibile, poiché un pickle accuratamente realizzato potrebbe eseguire codice arbitrario sul tuo sistema. Ad esempio, vedi https://blog.nelhage.com/2011/03/exploiting-pickle/
Esempio di andata e ritorno minimo
>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'
Modifica: ma per quanto riguarda la domanda di esempi reali di decapaggio, forse l' uso più avanzato del decapaggio (dovresti scavare abbastanza in profondità nella fonte) è ZODB: http://svn.zope.org/
Altrimenti, PyPI ne menziona diversi: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search
Ho visto personalmente diversi esempi di oggetti in salamoia inviati sulla rete come protocollo di trasferimento di rete facile da usare.
Il decapaggio è assolutamente necessario per il calcolo distribuito e parallelo.
Supponi di voler fare una riduzione della mappa parallela con multiprocessing
(o tra i nodi del cluster con pyina ), quindi devi assicurarti che la funzione che desideri avere mappata tra le risorse parallele si sgretoli. In caso contrario, non è possibile inviarlo ad altre risorse su un altro processo, computer, ecc. Vedere anche qui per un buon esempio.
Per fare questo, uso l' aneto , che può serializzare quasi tutto in Python. Dill ha anche alcuni buoni strumenti per aiutarti a capire cosa sta causando il fallimento del decapaggio in caso di errore del codice.
E, sì, le persone usano la selezione per salvare lo stato di un calcolo, la sessione di ipython o qualsiasi altra cosa.
L'ho usato in uno dei miei progetti. Se l'app è stata terminata durante il suo funzionamento (ha svolto un compito lungo ed elaborato molti dati), dovevo salvare l'intera struttura dei dati e ricaricarla dopo che l'app è stata eseguita di nuovo. Ho usato cPickle per questo, poiché la velocità era una cosa cruciale e la dimensione dei dati era davvero grande.
Pickle è come "Salva con nome .." e "Apri .." per le strutture e le classi di dati. Diciamo che voglio salvare le mie strutture di dati in modo che sia persistente tra le esecuzioni del programma.
Salvataggio:
with open("save.p", "wb") as f:
pickle.dump(myStuff, f)
Caricamento in corso:
try:
with open("save.p", "rb") as f:
myStuff = pickle.load(f)
except:
myStuff = defaultdict(dict)
Ora non ho più bisogno di ricostruire myStuff da zero, e posso semplicemente prendere (le) da dove avevo interrotto.
Per il principiante (come nel caso di me) è davvero difficile capire perché usare il sottaceto in primo luogo quando si legge la documentazione ufficiale . Forse perché i documenti implicano che conosci già l'intero scopo della serializzazione. Solo dopo aver letto la descrizione generale della serializzazione ho compreso il motivo di questo modulo e dei suoi casi d'uso comuni. Anche ampie spiegazioni della serializzazione ignorando un particolare linguaggio di programmazione possono essere di aiuto: https://stackoverflow.com/a/14482962/4383472 , Che cos'è la serializzazione? , https://stackoverflow.com/a/3984483/4383472
Posso dirti gli usi per cui lo uso e l'ho visto usato per:
Sono quelli per cui lo uso almeno
Uso il decapaggio durante la demolizione web di uno dei siti Web in quel momento, voglio archiviare più di 8000.000 URL e voglio elaborarli il più velocemente possibile, quindi uso il decapaggio perché la sua qualità di output è molto alta.
è possibile raggiungere facilmente l'URL e il punto in cui si interrompe anche la parola chiave della directory dei lavori è inoltre possibile recuperare i dettagli dell'URL molto velocemente per riprendere il processo.