class CaseInsensitiveDict(dict):
def _lower_keys(self):
return [k.lower() for k in self.keys()]
def __contains__(self, key):
return key.lower() in self._lower_keys()
def __getitem__(self, key):
return list(self.items())[self._lower_keys().index(key.lower())][1]
测试代码如下:
testDict = {"AA": "123", "bb": "A Good World!"}
args = CaseInsensitiveDict(testDict)
print 'aa' in args
运行结果为:
True
同样,print 'BB' in args的运行结果同样为True
我的理解如下:
当使用in操作去判断key是否存在于一个dict中时,dict会主动调用它自己的__contains__函数,而根据上面的代码可以看到
__contains__函数使用key.lower() in self._lower_keys()去判断,即先将当前key变为小写,然后判断它是否存在于dict的keys的集合中(全部是小写的keys)
因此,在判断的时候,完全不必担心传递进去的key是大写还是小写,因为内部的判断全是依据小写来进行的,正如类名所展示的那样,CaseInsensitive
即对大小写不敏感!
承接上面的论述,理解__getitem__如下:
testDict = {"AA": "123", "bb": "A Good World!"}
args = CaseInsensitiveDict(testDict)
a = list(testDict.items())
print a
结果为
[('AA', '123'), ('bb', 'A Good World!')]
可见 list(self.items()) 的结果是一个列表,而列表中的元素是由字典的key:value对构成的一个个元组
再然后就是根据index去读取列表的元素值,无须赘述