当我试图挑选一个相当复杂的对象时,我正在用jsonpickle
来解决这个异常,不幸的是我不知道如何在这里描述。我知道很难说很多,但是值得的是:
>>> 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'
在Google上搜索错误时,我找不到多少帮助。我确实看到在过去的某些时候,对于更简单的对象,解决了同样的问题:
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)])
有没有人遇到过这种情况并找到解决方案?我的理解是,我的案例可能与另一个已知的例子“不同的特殊性”。
答案 0 :(得分:2)
当我的.decode()时,我的请求模块似乎遇到了问题。在看了一下jsonpickle代码之后,我决定将它分叉并更改以下行以查看发生了什么(我最终保留了jsonpickle的私有副本以及更改,以便我可以继续前进)。
在jsonpickle / unpickler.py中(在我的版本中它的第368行),搜索方法_restore_from_dict()中的if语句部分:
if (util.is_noncomplex(instance) or
util.is_dictionary_subclass(instance)):
instance[k] = value
else:
setattr(instance, k, value)
并将其更改为此(它将记录失败的那些,然后您可以保留代码或更改具有__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)