KeyError: '_OrderedDict__root?

6

您好,我有以下代码片段会报错 KeyError。我已经检查了其他链接中指定的 要在 __init__ 中调用 Ordered Dict,我也这样做了,但仍然没有运气。

from collections import OrderedDict

class BaseExcelNode(OrderedDict):
    def __init__(self):
        super(BaseExcelNode, self).__init__()
        self.start_row = -1
        self.end_row = -1
        self.col_no = -1

    def __getattr__(self, name):
        return self[name]

    def __setattr__(self, name, value):
        self[name] = value
BaseExcelNode()

错误:

Traceback (most recent call last):
  File "CIMParser.py", line 29, in <module>
    BaseExcelNode()
  File "CIMParser.py", line 9, in __init__
    super(BaseExcelNode, self).__init__()
  File "C:\Python27\lib\collections.py", line 64, in __init__
    self.__root
  File "CIMParser.py", line 15, in __getattr__
    return self[name]
KeyError: '_OrderedDict__root'
2个回答

3

OrderedDict 实现的前提是属性访问依照默认机制,并且特别地,属性访问不等同于索引。

当你对其进行子类化并更改属性访问方式时,你会破坏 OrderedDict 实现中最深层的假设之一,从而导致一切混乱。


3
使用猴子补丁方法:
from collections import OrderedDict

class BaseExcelNode(OrderedDict):
    def __init__(self):
        super(BaseExcelNode, self).__init__()
        self.start_row = -1
        self.end_row = -1
        self.col_no = -1

    def __getattr__(self, name):
        if not name.startswith('_'):
            return self[name]
        super(BaseExcelNode, self).__getattr__(name)

    def __setattr__(self, name, value):
        if not name.startswith('_'):
            self[name] = value
        else:
            super(BaseExcelNode, self).__setattr__(name, value)

b = BaseExcelNode()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接