2009-06-21 83 views
8

我有一個CookieJar的對象,我想泡菜。如何醃製CookieJar?

但是,正如你們大概知道的那樣,在包含鎖定對象的對象上醃製扼流圈。出於某種可怕的原因,CookieJar有一個鎖定對象。

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 

我該如何堅持?

我能想到的唯一解決方案是將FileCookieJar.save和FileCookieJar.load用於stringIO對象。但是有更好的方法嗎?

+7

哇!這個問題聽起來像是在廚房工作的問題。我很驚訝用於這些工具的名稱:) – shahkalpesh 2009-06-21 05:25:28

+0

你有沒有得到一個好的解決方案?如果是這樣,請發帖。 – 2009-07-09 06:48:09

+0

@保羅亞歷克斯和Anurag的解決方案的工作。雖然Anurag的解決方案更加快速,但是Alex的解決方案更加通用,速度更慢,因此我會將其留給社區來決定哪個更好。 – Unknown 2009-07-09 22:38:05

回答

9

這是一個嘗試,通過從CookieJar中派生一個類來覆蓋pickle使用的getstate/setstate。我沒有使用cookieJar,所以不知道它是否可用,但你可以拋出派生類

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) 
6

CookieJar沒有特別精心設計的堅持(這是什麼FileCookieJar子大多是約 - !),但你可以遍歷一個CookieJar實例來獲得所有的cookies(和堅持的人的名單,例如)並且爲了重建給定Cookie的罐子,每個使用set_cookie。這就是我將如何設置持久化和非持久化cookie罐,使用copy_reg方法註冊適當的功能,如果我需要經常使用它們。