2016-09-09 1 views
4

Salut J'ai un extrait de code suivant qui donne KeyError. J'ai vérifié d'autres liens spécifiant make __init__ call to Ordered Dict que j'ai fait. Mais toujours pas de chance.KeyError: '_OrderedDict__root?

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

Error:

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' 

Répondre

1

En utilisant la méthode de correction de singe:

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() 
2

OrderedDict est mis en œuvre sous l'hypothèse que l'attribut œuvres d'accès par les mécanismes par défaut, et en particulier, que l'accès d'attribut n'est pas équivalent à l'indexation. Lorsque vous le sous-classez et que vous modifiez le fonctionnement de l'accès aux attributs, vous cassez l'une des hypothèses les plus profondes de l'implémentation OrderedDict, et tout va à l'enfer.