9

ピクルしたい CookieJar を持つオブジェクトがあります。

しかし、ご存知のように、pickle はロック オブジェクトを含むオブジェクトをチョークします。そして、なんらかの恐ろしい理由で、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 オブジェクトに使用することです。しかし、より良い方法はありますか?

4

2 に答える 2

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)
于 2009-06-21T05:01:30.360 に答える
7

CookieJar永続化のために特に適切に設計されているわけではありません (それがFileCookieJarサブクラスの主な目的です!-) が、CookieJarインスタンスを反復処理してすべての Cookie を取得し (たとえば、それらのリストを永続化)、指定された jar を再構築することができますクッキー、set_cookieそれぞれで使用します。copy_regこれが、頻繁に使用する必要がある場合に適切な関数を登録するメソッドを使用して、Cookie jar の永続化と非永続化を設定する方法です。

于 2009-06-21T04:56:19.820 に答える