美文网首页
datastructure

datastructure

作者: xncode | 来源:发表于2017-05-14 11:36 被阅读0次

    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

    相关文章

      网友评论

          本文标题:datastructure

          本文链接:https://www.haomeiwen.com/subject/nkldtxtx.html