Coverage for /home/martinb/.local/share/virtualenvs/camcops/lib/python3.6/site-packages/kombu/utils/objects.py : 36%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1"""Object Utilities."""
2from __future__ import absolute_import, unicode_literals
5class cached_property(object):
6 """Cached property descriptor.
8 Caches the return value of the get method on first call.
10 Examples:
11 .. code-block:: python
13 @cached_property
14 def connection(self):
15 return Connection()
17 @connection.setter # Prepares stored value
18 def connection(self, value):
19 if value is None:
20 raise TypeError('Connection must be a connection')
21 return value
23 @connection.deleter
24 def connection(self, value):
25 # Additional action to do at del(self.attr)
26 if value is not None:
27 print('Connection {0!r} deleted'.format(value)
28 """
30 def __init__(self, fget=None, fset=None, fdel=None, doc=None):
31 self.__get = fget
32 self.__set = fset
33 self.__del = fdel
34 self.__doc__ = doc or fget.__doc__
35 self.__name__ = fget.__name__
36 self.__module__ = fget.__module__
38 def __get__(self, obj, type=None):
39 if obj is None:
40 return self
41 try:
42 return obj.__dict__[self.__name__]
43 except KeyError:
44 value = obj.__dict__[self.__name__] = self.__get(obj)
45 return value
47 def __set__(self, obj, value):
48 if obj is None:
49 return self
50 if self.__set is not None:
51 value = self.__set(obj, value)
52 obj.__dict__[self.__name__] = value
54 def __delete__(self, obj, _sentinel=object()):
55 if obj is None:
56 return self
57 value = obj.__dict__.pop(self.__name__, _sentinel)
58 if self.__del is not None and value is not _sentinel:
59 self.__del(obj, value)
61 def setter(self, fset):
62 return self.__class__(self.__get, fset, self.__del)
64 def deleter(self, fdel):
65 return self.__class__(self.__get, self.__set, fdel)