2009-06-21 22 views
8

J'ai un objet avec un CookieJar que je veux décaper.Comment sélectionner un CookieJar?

Toutefois, comme vous le savez probablement tous, indiquez des étranglements sur les objets qui contiennent des objets verrouillés. Et pour une raison horrible, un CookieJar a un objet de verrouillage.

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 

Comment persister cela? La seule solution que je peux penser est d'utiliser FileCookieJar.save et FileCookieJar.load à un objet stringIO. Mais y a-t-il une meilleure façon?

+7

Wow !! La question ressemble à une question pour travailler dans la cuisine. Je suis étonné des noms utilisés pour les outils :) – shahkalpesh

+0

Avez-vous eu une bonne solution? Si oui, s'il vous plaît poster. –

+0

@Paul les solutions d'Alex et d'Anurag fonctionnent. Tandis que la solution d'Anurag est hackish et plus rapide, la solution d'Alex est plus générale et plus lente, donc je laisserai à la communauté pour décider ce qui est meilleur. – Unknown

Répondre

9

Voici une tentative, en dérivant une classe de CookieJar, qui remplace getstate/setstate utilisée par pickle. Je n'ai pas utilisé cookieJar, donc je ne sais pas si c'est utilisable mais vous pouvez vider la classe dérivée

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

par contre: il repose sur la logique interne de CookieJar –

+1

les pros: c'est simple et élégant! – Alex

+1

pour certaines définitions de 'élégant' = P. J'aime aussi cette approche. – Claudiu

6

CookieJar est pas particulièrement bien conçu pour avoir persisté (c'est ce que les FileCookieJar sous-classes sont surtout sur -!), Mais vous pouvez itérer sur une instance CookieJar pour obtenir tous les cookies (et persister une liste de ceux-ci, par exemple), et, pour reconstruire le pot donné les cookies, utilisez set_cookie sur chacun. Voilà comment je définirais sur les bocaux de cookies persistants et non persistants, en utilisant la méthode copy_reg pour enregistrer les fonctions appropriées si j'avais besoin de les utiliser souvent.

+0

Je pense que c'est une bien meilleure réponse que celle qui a été acceptée. Il est possible que le décapage soit vraiment ce dont il a besoin, mais cela semble plutôt improbable. Les sous-classes FileCookieJar sont plus simples, fiables, portables et prêtes à l'emploi. – rspeed