2014-12-17 1 views
0

Я пытаюсь десериализовать вывод cookielib.CookieJar.__repr__() обратно в объект CookieJar. Я сделал:Пытается вернуться назад (CookieJar)

cjs = repr(myCJ) 
cj = eval(cjs) 

Это дало SyntaxError: invalid syntax. Строка cjs длиной более 3000 символов, второе утверждение выше дал следующий фактический выход:

>>> cjx=eval(cjs) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<string>", line 1 
    <cookielib.CookieJar[Cookie(version=0, name='AMAuthCookie', value=' .... 
...........lots deleted....and next is the actual last line... 
comment=None, comment_url=None, rest={}, rfc2109=False)]> 
    ^
SyntaxError: invalid syntax 

Я подозреваю, что символ^указывает на очень первый символ Repr строки, где первые несколько символов являются:

>>> cjs[:50] 
"<cookielib.CookieJar[Cookie(version=0, name='AMAut" 

Могу ли я узнать, есть ли что-то в корне неправильно с тем, что я делаю, прежде чем я исследую, если функция repr дает проблемы.

ответ

1

repr не гарантируется eval способный. Вы должны сериализовать объект через pickle вместо этого, который предназначен для сериализации объектов и десериализации. Как так:

import cPickle 
cjs = cPickle.dumps(myCJ) 
cj = cPickle.loads(cjs) 

В этом случае представление, что CookieJar возвращает отдаленно не действительный синтаксис Python. Если вы абсолютно должны сделки с этим синтаксисом, вы можете попробовать

cookielist = eval(cjs[ len('<cookielib.CookieJar') : -len('>') ]) 

извлечь из списка печенье, а затем создать CookieJar от него. Но я не могу гарантировать, что это сработает.

+0

Спасибо. С cPickle я получаю 'TypeError: не могу раскрыть объекты блокировки' –

+0

Вместо этого вы можете попробовать протравить куки в cookiejar: http://stackoverflow.com/q/18169748/1204143 – nneonneo

+0

Спасибо. Вот что я сделал. Приложил немного усилий, но он работает. Round trip str() сравнивает матчи отлично. –