2012-06-26 53 views
1

我想用一组预定义的有效键实现两个不同的字典。另外,一个字典包含另一个字典。扩展Dict类的正确方法是什么?

class Otherdict (dict): 

    _keys = ['A','B'] 

    def __init__(self): 
     for key in self._keys: 
      self[key] = None 

    def populateDict(self): 
     self['B'] = 10 
     self['A'] = 12 

class MyDict(dict): 

    _keys = ['R','ED'] 

    def __init__(self): 
     for key in self._keys: 
      self[key] = None 

    def __getitem__(self, key): 
     if key not in self._keys: 
      raise Exception("'" + key + "'" + " is not a valid key") 
     dict.__getitem__(self,key) 

    def __setitem__(self, key, value): 
     if key not in self._keys: 
      raise Exception("'" + key + "'" + " is not a valid key") 
     dict.__setitem__(self,key,value) 

    def populateDict(self): 
     d = Otherdict() 
     d.populateDict() 
     self['R'] = 3 
     self['ED'] = d 


a = MyDict() 
a.populateDict() 
print a['ED'].__class__ #prints <type 'NoneType'> 

问题是由于某种原因,我无法访问位于'ED'键下的字典。我在这里做错了什么?

我也注意到,如果我删除__getitem__()方法,代码工作正常

+1

您是否需要执行'if key not in self._keys:'check?你不能只调用'dict .__ getitem__'并让异常传播吗? – Eric

+1

我只是推荐你使用比'Exception'更特殊的异常类型;它会使捕捉异常更容易。 – JPvdMerwe

+0

影响巨大的轻微错误,很容易被发现。尽管如此,没有理由-1,恕我直言。 – glglgl

回答

8

__getitem__必须返回值:

def __getitem__(self, key): 
    if key not in self._keys: 
     raise Exception("'" + key + "'" + " is not a valid key") 
    return dict.__getitem__(self,key) 

如果没有明确return语句,Python函数返回None默认。

+1

谢谢,它的作品!现在看来很明显,我知道问题是什么,这是一个初学者的错误! –

3

使用returndef __getitem__(self, key)return dict.__getitem__(self,key)

代码当您删除__getitem__这是因为它然后从父类访问__getitem__(在这种情况下dict)正常运行。

相关问题