学习httpbin源码记录(一)

来源:互联网 发布:域名怎么和服务器绑定 编辑:程序博客网 时间:2024/05/24 02:39
# -*- coding: utf-8 -*-


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


        if key in self:

            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去读取列表的元素值,无须赘述




原创粉丝点击