2009-06-21 15 views
8

Mam obiekt z CookieJar, który chcę pickle.Jak zalać CookieJar?

Jednak, jak wszyscy zapewne wiecie, dławiki pikle na obiektach zawierających obiekty blokujące. I z jakiegoś okropnego powodu CookieJar ma obiekt blokady.

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 

Jak mogę to utrzymać?

Jedynym rozwiązaniem, które mogę wymyślić jest użycie FileCookieJar.save i FileCookieJar.load do obiektu stringIO. Ale czy istnieje lepszy sposób?

+7

Wow! Pytanie brzmi jak pytanie do pracy w kuchni. Jestem zdumiony nazwami używanymi do narzędzi :) – shahkalpesh

+0

Czy otrzymałeś dobre rozwiązanie? Jeśli tak, opublikuj. –

+0

@Paul działa zarówno rozwiązanie Alexa, jak i Anuraga. Podczas gdy rozwiązanie Anuraga jest hackowe i szybsze, rozwiązanie Alexa jest bardziej ogólne i wolniejsze, więc pozostawię to społeczności, aby zdecydować, która jest lepsza. – Unknown

Odpowiedz

9

Oto próba, wyprowadzenie klasy z CookieJar, która zastępuje getstate/setstate używane przez pickle. Nie użyłem cookieJar, więc nie wiem, czy można go użyć, ale można zrzucić klasę pochodną

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

cons: opiera się na wewnętrznej logice użytkowników CookieJar –

+1

plusów: jest prosty i elegancki! – Alex

+1

dla niektórych definicji "elegancki" = P. Ja też lubię takie podejście. – Claudiu

6

CookieJar nie jest szczególnie dobrze zaprojektowane dla utrzymujących się (to co FileCookieJar podklasy są głównie o -!), Ale można iteracyjne nad CookieJar instancji, aby wszystkie pliki cookie (i utrzymują listę osób, na przykład), i, aby odbudować słoik podany przy ciasteczkach, użyj set_cookie na każdym z nich. Tak postawiłbym na utrzymujące się i nie nadające się do przechowywania słoiki z ciastkami, używając metody copy_reg do zarejestrowania odpowiednich funkcji, jeśli potrzebowałem ich często używać.

+0

Czuję, że jest to o wiele lepsza odpowiedź niż ta, która została przyjęta. Możliwe, że marynowanie jest naprawdę tym, czego potrzebuje, ale wydaje się mało prawdopodobne. Podklasy FileCookieJar są prostsze, niezawodne, przenośne i gotowe do użycia po wyjęciu z pudełka. – rspeed