2012-06-26 54 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)正常運行。

相關問題