2017-02-07 16 views
1

불행히도 여기에 설명하는 방법이 확실하지 않은 다소 복잡한 객체를 피클 링할 때 으로이 예외가 발생합니다. 많은 것을 말하기는 힘들지만 가치있는 것은 무엇인지 알고 있습니다.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)]) 

은 누구도으로 실행하고있다 이것 스스로가 해결책을 찾았습니까? 나는 나의 사례가 다른 알려진 사례와 "다르게 idiosynchratic"일 수 있다는 것을 이해하면서 질문한다.

답변

1

나를위한 요청 모듈이 .decode() 문제가 발생하는 것 같습니다. jsonpickle 코드를 조금보고 난 후, 나는 그것을 포크하고 다음 행을 변경하여 무슨 일이 일어나고 있는지를 결정했다. 그리고 나는 앞으로 나아갈 수 있도록 변경된 jsonpickle의 개인 복사본을 유지했다.

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

그것은 사람을 logERROR합니다 (이로 변경 : jsonpickle에서

은/unpickler.py는 방법 _restore_from_dict (의 if 문 섹션)를 검색 (내 버전에서 선 368입니다) 그 중 실패하거나 다음 코드를 유지할 수 또는 __root있는 OrderedDict 버전을 변경하십시오

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)