質問

ピクルスにしたい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からクラスを派生させて、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)

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top