2009-06-21 6 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

Wow !!質問は、台所で働くことの質問のように聞こえる。私はツールに使用されている名前に驚いています:) – shahkalpesh

+0

あなたは良い解決策を得ましたか?もしそうなら、投稿してください。 –

+0

@Paul AlexとAnuragの両方のソリューションが動作します。 Anuragのソリューションは急速で速いですが、Alexのソリューションはより一般的で低速ですので、私はそれをコミュニティに任せて、どちらが良いかを判断します。 – Unknown

答えて

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) 
+0

短所:CookieJar –

+1

プロの内部ロジックに依存しています。シンプルでエレガントです! – Alex

+1

では、 'elegant' = Pの定義がいくつかあります。私はこのアプローチも好きです。 – Claudiu

6

CookieJarは、特に持続のためにうまく設計されていませんクッキーを入れた瓶を再構築するには、それぞれにset_cookieを使用してください。これは、私が頻繁に使用する必要がある場合は、適切な機能を登録するためにcopy_regメソッドを使用して、永続的で固定されていないクッキージャーを設定する方法です。

+0

私はこれが受け入れられたものよりはるかに良い答えだと感じます。酸洗いが実際に必要なものである可能性はありますが、むしろそうではないようです。 FileCookieJarサブクラスは、よりシンプルで信頼性が高く、移植性があり、すぐに使用できるように用意されています。 – rspeed

関連する問題