2009-06-21 5 views
8

나는 피클하고 싶은 쿠키 뚜껑이있는 물건이 있습니다.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 객체에 사용하는 것입니다. 그러나 더 좋은 방법이 있습니까? ,하지만 당신은 모든 쿠키를 얻을 수있는 CookieJar 인스턴스를 반복 (예를 들어, 사람들의 목록을 유지) 할 수 있습니다 - (! 즉 FileCookieJar 서브 클래스 대부분에 대해 무엇이다)

+7

와우 !! 질문은 부엌에서 일하는 것에 대한 질문과 같습니다. 도구에 사용 된 이름에 놀랐습니다 :) – shahkalpesh

+0

좋은 해결책을 얻었습니까? 그렇다면 게시하십시오. –

+0

@Paul Alex와 Anurag의 솔루션이 모두 작동합니다. Anurag의 솔루션은 빠른 속도로 진행되는 반면, Alex의 솔루션은 좀 더 일반적이고 느립니다. 따라서 더 나은 것을 결정하기 위해 커뮤니티에 맡기겠습니다. – Unknown

답변

9

다음은 pickle에서 사용하는 getstate/setstate를 재정의하는 CookieJar에서 클래스를 파생시켜 시도한 것입니다. 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) 
+0

단점 : CookieJar –

+1

전문가의 내부 논리에 의존 : 간단하고 우아합니다! '우아한'= P의 일부 정의는 – Alex

+1

입니다. 그래도 나는이 접근 방식을 좋아한다. – Claudiu

6

CookieJar 특히 지속 잘 설계되지 않았습니다 쿠키가 들어있는 병을 다시 만들려면 각각에 set_cookie을 사용하십시오. 그래서 쿠키를 자주 사용해야 할 경우 적절한 기능을 등록하기 위해 copy_reg 메서드를 사용하여 쿠키 지속 및 지속되지 않는 쿠키 병을 설정하는 방법입니다.

+0

나는 이것이 받아 들여진 것보다 훨씬 더 나은 대답이라고 느낍니다. 산 세척은 실제로 필요한 것일 수도 있지만 가능성은 희박합니다. FileCookieJar 서브 클래스는보다 간단하고 신뢰할 수 있으며 이식성이 뛰어나고 즉시 사용할 수 있습니다. – rspeed