我有一个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对象。但是有更好的方法吗?
答案 0 :(得分: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)
答案 1 :(得分:7)
CookieJar
并不是特别精心设计用于持久化(这是FileCookieJar
子类主要关注的内容! - ),但您可以迭代CookieJar
实例来获取所有Cookie(并保留一份列表(例如),并且,为了重建给定cookie的jar,在每个上使用set_cookie
。这就是我如何设置有关持久化和无法使用cookie的方法,如果我需要经常使用它们,可以使用copy_reg
方法注册相应的函数。