orderedset
直接使用了collection中的orderdict來實(shí)現(xiàn)呛每,初始化函數(shù)中接入一個(gè)可迭代的對(duì)象赂韵,取出每一項(xiàng)作為key值族淮,value均填空。
add remove discard都是對(duì)應(yīng)操作orderdict來實(shí)現(xiàn)
multivaluedict
使用了list作為value的類型來實(shí)現(xiàn)一個(gè)key值對(duì)應(yīng)多個(gè)value
在獲取值時(shí)锐帜,如果value有值則返回list中的最后一個(gè)元素,否則返回一個(gè)空列表畜号,設(shè)置值則為標(biāo)準(zhǔn)的key value設(shè)置缴阎,只是value會(huì)被轉(zhuǎn)換為list
此外還有一些針對(duì)list的操作 如getlist setlist setlistdefault appendlist等是在value的list級(jí)別上進(jìn)行操作的
對(duì)應(yīng)迭代器的實(shí)現(xiàn),items values的實(shí)現(xiàn)是正常的简软,有一個(gè)lists函數(shù)的實(shí)現(xiàn)是對(duì)應(yīng)py3特有的iterlists
此外提供了一個(gè)update方法及一些奇怪的東西getstate和setstate的描述符
Immutablelist
class ImmutableList(tuple):
"""
可以提供有用錯(cuò)誤信息的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):
"""
在返回值前蛮拔,根據(jù)傳入的key值是否有prefix開頭來決定是否調(diào)用func
"""
def __init__(self, data, func, prefix):
super(DictWrapper, self).__init__(data)
self.func = func
self.prefix = prefix
def __getitem__(self, key):
# 發(fā)現(xiàn)了特定prefix開頭的key 需要調(diào)用用戶指定的函數(shù)
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) # 在返回前調(diào)用用戶指定的函數(shù)
return value