2009-06-21 12 views
8

Ho un oggetto con un CookieJar che voglio mettere sottaceto.Come mettere un CookieJar sottaceto?

Tuttavia, come probabilmente tutti sapete, il pickle si strozza sugli oggetti che contengono oggetti di blocco. E per qualche ragione orribile, un CookieJar ha un oggetto di blocco.

from cPickle import dumps 
from cookielib import CookieJar 

class Person(object): 
    def __init__(self, name): 
     self.name = name 
     self.cookies = CookieJar() 

bob = Person("bob") 
dumps(bob) 

# Traceback (most recent call last): 
# File "<stdin>", line 1, in <module> 
# cPickle.UnpickleableError: Cannot pickle <type 'thread.lock'> objects 

Come faccio persistono questo?

L'unica soluzione che posso pensare è utilizzare FileCookieJar.save e FileCookieJar.load in un oggetto stringIO. Ma c'è un modo migliore?

+7

Wow !! La domanda suona come una domanda per lavorare in cucina. Sono stupito dei nomi usati per gli strumenti :) – shahkalpesh

+0

Hai trovato una buona soluzione? Se è così, per favore pubblica. –

+0

@Paul funzionano entrambe le soluzioni di Alex e Anurag. Mentre la soluzione di Anurag è hacker e più veloce, la soluzione di Alex è più generale e più lenta, quindi lascerò decidere alla community quale è meglio. – Unknown

risposta

9

Ecco un tentativo, derivando una classe da CookieJar, che sostituisce getstate/setstate utilizzato da pickle. Non ho usato cookieJar, quindi non so se è utilizzabile ma puoi scaricare la classe derivata

from cPickle import dumps 
from cookielib import CookieJar 
import threading 

class MyCookieJar(CookieJar): 
    def __getstate__(self): 
     state = self.__dict__.copy() 
     del state['_cookies_lock'] 
     return state 

    def __setstate__(self, state): 
     self.__dict__ = state 
     self._cookies_lock = threading.RLock() 

class Person(object): 
    def __init__(self, name): 
     self.name = name 
     self.cookies = MyCookieJar() 

bob = Person("bob") 
print dumps(bob) 
+0

sv: si basa sulla logica interna di CookieJar –

+1

pro: è semplice ed elegante! – Alex

+1

per alcune definizioni di 'elegante' = P. Anche a me piace questo approccio. – Claudiu

6

CookieJar non è particolarmente ben progettato per la persistenza (che è quello che i FileCookieJar sottoclassi sono per lo più su -!), Ma si può iterare su un'istanza CookieJar per ottenere tutti i cookie (e persistono un elenco di quelli, per esempio), e, per ricostruire il barattolo dati i cookie, utilizzare set_cookie su ciascuno. Ecco come impostare i cookie persistenti e non persistenti, usando il metodo copy_reg per registrare le funzioni appropriate se dovessi usarle spesso.

+0

Ritengo che questa sia una risposta molto migliore di quella che è stata accettata. È possibile che il decapaggio sia davvero ciò di cui ha bisogno, ma sembra piuttosto improbabile. Le sottoclassi FileCookieJar sono più semplici, affidabili, portatili e pronte all'uso. – rspeed