【问题标题】:Python jsonpickle error: 'OrderedDict' object has no attribute '_OrderedDict__root'Python jsonpickle 错误:“OrderedDict”对象没有属性“_OrderedDict__root”
【发布时间】:2017-02-07 19:39:06
【问题描述】:

我在尝试腌制一个相当复杂的对象时遇到了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'

我在谷歌上搜索错误时找不到太多帮助。我确实看到在过去的某个时间,对于更简单的对象,同样的问题得到了解决:

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)])

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

【问题讨论】:

    标签: python attributeerror ordereddictionary jsonpickle


    【解决方案1】:

    当我 .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)
    

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 2012-11-15
      • 2014-05-14
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 2021-06-04
      • 2016-04-17
      • 2014-03-30
      相关资源
      最近更新 更多