首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python jsonpickle错误:'OrderedDict‘对象没有'_OrderedDict__root’属性

Python jsonpickle错误:'OrderedDict‘对象没有'_OrderedDict__root’属性
EN

Stack Overflow用户
提问于 2017-02-08 03:39:06
回答 1查看 1.5K关注 0票数 2

我在jsonpickle中遇到了这个异常,当我试图剔除一个相当复杂的对象时,不幸的是,我不确定如何在这里描述它。我知道这很难说太多,但这是值得的:

代码语言:javascript
复制
>>> 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

该报告中引用的示例适用于我:

代码语言:javascript
复制
>>> jsonpickle.decode(jsonpickle.encode(collections.OrderedDict()))
OrderedDict()
>>> jsonpickle.decode(jsonpickle.encode(collections.OrderedDict(a=1)))
OrderedDict([(u'a', 1)])

有没有人自己遇到过这个问题,并找到了解决方案?我问道,我的情况可能与另一个已知的例子“不同的特点”。

EN

回答 1

Stack Overflow用户

发布于 2017-11-17 05:52:22

当我使用.decode()时,我的requests模块似乎遇到了问题。在看了一下jsonpickle代码之后,我决定派生它并更改以下几行代码以查看发生了什么(最后我保留了一份包含更改的jsonpickle的私有副本,这样我就可以继续前进了)。

在jsonpickle/unickler.py(在我的版本中是第368行)中,在方法_restore_from_dict()中搜索if语句部分:

代码语言:javascript
复制
if (util.is_noncomplex(instance) or
    util.is_dictionary_subclass(instance)):
    instance[k] = value
else:
    setattr(instance, k, value)

并将其更改为以下内容(它将logERROR失败的代码,然后您可以保留代码或更改具有__root的OrderedDict的版本)

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42098510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档