orderedset
直接使用了collection中的orderdict来实现,初始化函数中接入一个可迭代的对象,取出每一项作为key值,value均填空。
add remove discard都是对应操作orderdict来实现
multivaluedict
使用了list作为value的类型来实现一个key值对应多个value
在获取值时,如果value有值则返回list中的最后一个元素,否则返回一个空列表,设置值则为标准的key value设置,只是value会被转换为list
此外还有一些针对list的操作 如getlist setlist setlistdefault appendlist等是在value的list级别上进行操作的
对应迭代器的实现,items values的实现是正常的,有一个lists函数的实现是对应py3特有的iterlists
此外提供了一个update方法及一些奇怪的东西getstate和setstate的描述符
Immutablelist
class ImmutableList(tuple):
"""
可以提供有用错误信息的tuple
"""
def __new__(cls, *args, **kwargs):
if 'warning' in kwargs:
warning = kwargs['warning']
del kwargs['warning']
else:
warning = 'ImmutableList object is immutable.'
self = tuple.__new__(cls, *args, **kwargs)
self.warning = warning
return self
def complain(self, *wargs, **kwargs):
if isinstance(self.warning, Exception):
raise self.warning
else:
raise AttributeError(self.warning)
__delitem__ = complain
__delslice__ = complain
__iadd__ = complain
__imul__ = complain
__setitem__ = complain
__setslice__ = complain
append = complain
extend = complain
insert = complain
pop = complain
remove = complain
sort = complain
reverse = complain
DictWrapper
class DictWrapper(dict):
"""
在返回值前,根据传入的key值是否有prefix开头来决定是否调用func
"""
def __init__(self, data, func, prefix):
super(DictWrapper, self).__init__(data)
self.func = func
self.prefix = prefix
def __getitem__(self, key):
# 发现了特定prefix开头的key 需要调用用户指定的函数
if key.startswith(self.prefix):
use_func = True
key = key[len(self.prefix):] # 去掉增加的prefix
else:
use_func = False
value = super(DictWrapper, self).__getitem__(key) # 获取值
if use_func:
return self.func(value) # 在返回前调用用户指定的函数
return value