datastructure

2017-05-14  本文已影响0人  xncode

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
上一篇下一篇

猜你喜欢

热点阅读