LazySlicingIterable   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 17
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 17
rs 10
wmc 6

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __init__() 0 3 1
A __len__() 0 2 1
A __getitem__() 0 9 4
1
# shamelessly taken from kombu.utils
2
import sys
3
4
PY3 = sys.version_info[0] == 3
5
6
7
class LazySlicingIterable(object):
8
    def __init__(self, length_getter, items_getter):
9
        self.length_getter = length_getter
10
        self.items_getter = items_getter
11
12
    def __len__(self):
13
        return self.length_getter()
14
15
    def __getitem__(self, k):
16
        if isinstance(k, int):
17
            return self.items_getter(k, k)
18
        elif isinstance(k, slice):
19
            if k.step:
20
                raise RuntimeError("Can't use steps for slicing.")
21
            return self.items_getter(k.start, k.stop)
22
        else:
23
            raise TypeError("Must be int or slice.")
24
25
26
class cached_property(object):
27
    """Property descriptor that caches the return value
28
    of the get function.
29
30
    *Examples*
31
32
    .. code-block:: python
33
34
        @cached_property
35
        def connection(self):
36
            return Connection()
37
38
        @connection.setter  # Prepares stored value
39
        def connection(self, value):
40
            if value is None:
41
                raise TypeError("Connection must be a connection")
42
            return value
43
44
        @connection.deleter
45
        def connection(self, value):
46
            # Additional action to do at del(self.attr)
47
            if value is not None:
48
                print("Connection %r deleted" % (value, ))
49
50
    """
51
52
    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
53
        self.__get = fget
54
        self.__set = fset
55
        self.__del = fdel
56
        self.__doc__ = doc or fget.__doc__
57
        self.__name__ = fget.__name__
58
        self.__module__ = fget.__module__
59
60
    def __get__(self, obj, type=None):
61
        if obj is None:
62
            return self
63
        try:
64
            return obj.__dict__[self.__name__]
65
        except KeyError:
66
            value = obj.__dict__[self.__name__] = self.__get(obj)
67
            return value
68
69
    def __set__(self, obj, value):
70
        if obj is None:
71
            return self
72
        if self.__set is not None:
73
            value = self.__set(obj, value)
74
        obj.__dict__[self.__name__] = value
75
76
    def __delete__(self, obj):
77
        if obj is None:
78
            return self
79
        try:
80
            value = obj.__dict__.pop(self.__name__)
81
        except KeyError:
82
            pass
83
        else:
84
            if self.__del is not None:
85
                self.__del(obj, value)
86
87
    def setter(self, fset):
88
        return self.__class__(self.__get, fset, self.__del)
89
90
    def deleter(self, fdel):
91
        return self.__class__(self.__get, self.__set, fdel)
92