Вопрос

У меня есть объект с 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, который переопределяет getstate / setstate, используемый pickle. Я не использовал 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 < Экземпляр / code>, чтобы получить все файлы cookie (и сохранить их список, например), и, чтобы перестроить банку с учетом файлов cookie, используйте set_cookie для каждого из них. Вот как я бы настроился на сохранение и отмену хранения файлов cookie, используя метод copy_reg для регистрации соответствующих функций, если мне нужно было их часто использовать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top