扩展Dict类的正确方法是什么?

时间:2012-06-26 09:33:24

标签: python dictionary extend

我想用一组预定义的有效键来实现两个不同的词典。另外,一个字典包含另一个字典。

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__()方法,代码就能正常运行

2 个答案:

答案 0 :(得分: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)

return中使用def __getitem__(self, key)return dict.__getitem__(self,key)

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