kennethreitz大神写的,项目地址

MultiDict

MultiDict是字典的一个子类用来为相同的key设置多个值,比如在wrappers中被解析函数。这是必要的因为一些HTML form表单会为同样的key设置多个值。

它实现了多种标准的字典方法。本质上,它在一个key中将value放在一个list中作为值。但是标准字典的获取方法只会返回key中的第一个值。如果你想获取其他值,你必须使用如下所示的list方法。

1
2
3
4
5
6
7
d = MultiDict([('a', 'b'), ('a', 'c')])
d.getlist('a')
# ['b', 'c']
'a' in d
# True
d['a']
# 'b'

KeyError也是BadRequest的子类,因此当被捕获的时候会渲染400 BAD REQUEST

所以说白了,就是一个key对应了一个list,然后一般返回的只是key和list[0],然后实现了一系列的方法。

CaseInsensitiveDict

比如headers['content-encoding']将会被返回headers['Content-Encoding']的值。实现也很简单,就是读取的时候将键都转换成小写就行了。源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class CaseInsensitiveDict(dict):
def _lower_keys(self):
# 将字典的key都转换成小写
return [k.lower() for k in self.keys()]
def __contains__(self, key):
# 判断某个key(转换成小写)是否存在于字典中(key都转换成小写)
return key.lower() in self._lower_keys()
def __getitem__(self, key):
# 这里有个问题就是key如果是None,这里就会报错,所以应该
# if key is None:
# return
if key in self:
# 先找到目标key在keys中的位置,然后取出来一个元组,第二个值就是value
return list(self.items())[self._lower_keys().index(key.lower())][1]

这里涉及到一个知识点,就是Python字典中的keys(), values()items()方法返回的是view对象。它基于字典的实体提供了动态的view,意味着当字典改变的时候,view会表现这个改变。

字典views会被迭代并且生成它们各自的数据,并且支持成员测试。

keys和values会被以任意的顺序迭代,但是这个顺序不是随机的,而是基于不同的Python实现而不同,并且基于字典的插入和删除历史。如果keys,values和items views迭代过程中没有改变字典的话,它们之间的顺序将是一致的。因此可以使用pair = zip(d.values(), d.keys()),另外一种创建相同的列表的方法是pair = [(v, k) for (k, v) in d.items()]