CookieJarをピクルする方法は?
-
06-07-2019 - |
質問
ピクルスにしたい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の永続化と非永続化を設定する方法です。
所属していません StackOverflow