2017-02-07 3 views
1

Я удаляю это исключение с jsonpickle, пытаясь рассолить довольно сложный объект, к сожалению, я не уверен, как здесь описывать. Я знаю, что делает его трудно сказать много, но для чего это стоит:Ошибка Python jsonpickle: объект «OrderedDict» не имеет атрибута «_OrderedDict__root»

>>> frozen = jsonpickle.encode(my_complex_object_instance) 
>>> thawed = jsonpickle.decode(frozen) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Python/2.7/site-packages/jsonpickle/__init__.py", 
    line 152, in decode 
    return unpickler.decode(string, backend=backend, keys=keys) 
     : 
     : 
    File "/Library/Python/2.7/site-packages/jsonpickle/unpickler.py", 
    line 336, in _restore_from_dict 
    instance[k] = value 
    File "/Library/Python/2.7/site-packages/botocore/vendored/requests/packages/urllib3/packages/ordered_dict.py", 
    line 49, in __setitem__ 
    root = self.__root 
AttributeError: 'OrderedDict' object has no attribute '_OrderedDict__root' 

Я не нахожу много помощи, когда прибегая к ошибке. Я вижу, что выглядит как та же проблема была решена в некоторый момент прошлого для простых объектов:

https://github.com/jsonpickle/jsonpickle/issues/33

Приведенный пример в этом докладе работает для меня:

>>> jsonpickle.decode(jsonpickle.encode(collections.OrderedDict())) 
OrderedDict() 
>>> jsonpickle.decode(jsonpickle.encode(collections.OrderedDict(a=1))) 
OrderedDict([(u'a', 1)]) 

Кто-нибудь когда-нибудь с это сами и нашли решение? Я спрашиваю с пониманием, что мой случай может быть «по-другому идиосинхронным», чем другой известный пример.

ответ

1

Модуль запросов для меня, похоже, сталкивается с проблемами при использовании .decode(). Посмотрев код jsonpickle немного, я решил разветвить его и изменить следующие строки, чтобы увидеть, что происходит (и я закончил тем, что сохранил личную копию jsonpickle с изменениями, чтобы я мог двигаться вперед).

В jsonpickle/unpickler.py (в моей версии это строка 368), найдите раздел, если заявление в методе _restore_from_dict():

if (util.is_noncomplex(instance) or 
    util.is_dictionary_subclass(instance)): 
    instance[k] = value 
else: 
    setattr(instance, k, value) 

и изменить его к этому (он LogError те которые терпят неудачу, а затем вы можете либо сохранить код на месте, либо изменить версию вашего OrderedDict с __root)

if (util.is_noncomplex(instance) or 
    util.is_dictionary_subclass(instance)): 
    # Currently requests.adapters.HTTPAdapter is using a non-standard 
    # version of OrderedDict which doesn't have a _OrderedDict__root 
    # attribute 
    try: 
     instance[k] = value 
    except AttributeError as e: 
     import logging 
     import pprint 
     warnmsg = 'Unable to unpickle {}[{}]={}'.format(pprint.pformat(instance), pprint.pformat(k), pprint.pformat(value)) 
     logging.error(warnmsg) 
else: 
    setattr(instance, k, value) 
Смежные вопросы