Coverage for blind_charging/thunk.py: 52%
197 statements
« prev ^ index » next coverage.py v6.5.0, created at 2023-02-17 20:36 +0000
« prev ^ index » next coverage.py v6.5.0, created at 2023-02-17 20:36 +0000
1from typing import Any, Callable, Optional
4def _method_proxy(inst: Any, name: str, *args, **kwargs) -> Optional[Any]:
5 """Proxy the given method to the given object.
7 :param inst: Source object
8 :param name: Name of method to proxy
9 :param *args: Any positional arguments to pass to method
10 :param **kwargs: Any keyword arguments to pass to method
11 :returns: Result of executing source's method
12 """
13 obj = object.__getattribute__(inst, "_factory")()
14 return object.__getattribute__(obj, name)(*args, **kwargs)
17class Thunk(object):
18 """A simple lazy-initialized object proxy."""
20 __slots__ = ["_factory", "_value", "_called"]
22 def __init__(self, f: Callable[[], Any]):
23 def _factory():
24 if not object.__getattribute__(self, "_called"):
25 result = f() if callable(f) else f
26 object.__setattr__(self, "_value", result)
27 object.__setattr__(self, "_called", True)
28 return object.__getattribute__(self, "_value")
30 object.__setattr__(self, "_factory", _factory)
31 object.__setattr__(self, "_value", None)
32 object.__setattr__(self, "_called", False)
34 def __getattribute__(self, *args, **kwargs):
35 return _method_proxy(self, "__getattribute__", *args, **kwargs)
37 def __setattr__(self, *args, **kwargs):
38 return _method_proxy(self, "__setattr__", *args, **kwargs)
40 def __delattr__(self, *args, **kwargs):
41 return _method_proxy(self, "__delattr__", *args, **kwargs)
43 def __getitem__(self, *args, **kwargs):
44 return _method_proxy(self, "__getitem__", *args, **kwargs)
46 def __setitem__(self, *args, **kwargs):
47 return _method_proxy(self, "__setitem__", *args, **kwargs)
49 def __delitem__(self, *args, **kwargs):
50 return _method_proxy(self, "__delitem__", *args, **kwargs)
52 def __call__(self, *args, **kwargs):
53 return _method_proxy(self, "__call__", *args, **kwargs)
55 def __iter__(self, *args, **kwargs):
56 return _method_proxy(self, "__iter__", *args, **kwargs)
58 def __reversed__(self, *args, **kwargs):
59 return _method_proxy(self, "__reversed__", *args, **kwargs)
61 def __contains__(self, *args, **kwargs):
62 return _method_proxy(self, "__contains__", *args, **kwargs)
64 def __missing__(self, *args, **kwargs):
65 return _method_proxy(self, "__missing__", *args, **kwargs)
67 def __len__(self, *args, **kwargs):
68 return _method_proxy(self, "__len__", *args, **kwargs)
70 def __str__(self, *args, **kwargs):
71 return _method_proxy(self, "__str__", *args, **kwargs)
73 def __repr__(self, *args, **kwargs):
74 return _method_proxy(self, "__repr__", *args, **kwargs)
76 def __unicode__(self, *args, **kwargs):
77 return _method_proxy(self, "__unicode__", *args, **kwargs)
79 def __format__(self, *args, **kwargs):
80 return _method_proxy(self, "__format__", *args, **kwargs)
82 def __hash__(self, *args, **kwargs):
83 return _method_proxy(self, "__hash__", *args, **kwargs)
85 def __nonzero__(self, *args, **kwargs):
86 return _method_proxy(self, "__nonzero__", *args, **kwargs)
88 def __dir__(self, *args, **kwargs):
89 return _method_proxy(self, "__dir__", *args, **kwargs)
91 def __sizeof__(self, *args, **kwargs):
92 return _method_proxy(self, "__sizeof__", *args, **kwargs)
94 def __int__(self, *args, **kwargs):
95 return _method_proxy(self, "__int__", *args, **kwargs)
97 def __long__(self, *args, **kwargs):
98 return _method_proxy(self, "__long__", *args, **kwargs)
100 def __float__(self, *args, **kwargs):
101 return _method_proxy(self, "__float__", *args, **kwargs)
103 def __complex__(self, *args, **kwargs):
104 return _method_proxy(self, "__complex__", *args, **kwargs)
106 def __oct__(self, *args, **kwargs):
107 return _method_proxy(self, "__oct__", *args, **kwargs)
109 def __hex__(self, *args, **kwargs):
110 return _method_proxy(self, "__hex__", *args, **kwargs)
112 def __index__(self, *args, **kwargs):
113 return _method_proxy(self, "__index__", *args, **kwargs)
115 def __trunc__(self, *args, **kwargs):
116 return _method_proxy(self, "__trunc__", *args, **kwargs)
118 def __coerce__(self, *args, **kwargs):
119 return _method_proxy(self, "__coerce__", *args, **kwargs)
121 def __cmp__(self, *args, **kwargs):
122 return _method_proxy(self, "__cmp__", *args, **kwargs)
124 def __eq__(self, *args, **kwargs):
125 return _method_proxy(self, "__eq__", *args, **kwargs)
127 def __ne__(self, *args, **kwargs):
128 return _method_proxy(self, "__ne__", *args, **kwargs)
130 def __lt__(self, *args, **kwargs):
131 return _method_proxy(self, "__lt__", *args, **kwargs)
133 def __gt__(self, *args, **kwargs):
134 return _method_proxy(self, "__gt__", *args, **kwargs)
136 def __le__(self, *args, **kwargs):
137 return _method_proxy(self, "__le__", *args, **kwargs)
139 def __ge__(self, *args, **kwargs):
140 return _method_proxy(self, "__ge__", *args, **kwargs)
142 def __pos__(self, *args, **kwargs):
143 return _method_proxy(self, "__pos__", *args, **kwargs)
145 def __neg__(self, *args, **kwargs):
146 return _method_proxy(self, "__neg__", *args, **kwargs)
148 def __abs__(self, *args, **kwargs):
149 return _method_proxy(self, "__abs__", *args, **kwargs)
151 def __invert__(self, *args, **kwargs):
152 return _method_proxy(self, "__invert__", *args, **kwargs)
154 def __round__(self, *args, **kwargs):
155 return _method_proxy(self, "__round__", *args, **kwargs)
157 def __floor__(self, *args, **kwargs):
158 return _method_proxy(self, "__floor__", *args, **kwargs)
160 def __ceil__(self, *args, **kwargs):
161 return _method_proxy(self, "__ceil__", *args, **kwargs)
163 def __add__(self, *args, **kwargs):
164 return _method_proxy(self, "__add__", *args, **kwargs)
166 def __sub__(self, *args, **kwargs):
167 return _method_proxy(self, "__sub__", *args, **kwargs)
169 def __mul__(self, *args, **kwargs):
170 return _method_proxy(self, "__mul__", *args, **kwargs)
172 def __floordiv__(self, *args, **kwargs):
173 return _method_proxy(self, "__floordiv__", *args, **kwargs)
175 def __div__(self, *args, **kwargs):
176 return _method_proxy(self, "__div__", *args, **kwargs)
178 def __truediv__(self, *args, **kwargs):
179 return _method_proxy(self, "__truediv__", *args, **kwargs)
181 def __mod__(self, *args, **kwargs):
182 return _method_proxy(self, "__mod__", *args, **kwargs)
184 def __divmod__(self, *args, **kwargs):
185 return _method_proxy(self, "__divmod__", *args, **kwargs)
187 def __pow__(self, *args, **kwargs):
188 return _method_proxy(self, "__pow__", *args, **kwargs)
190 def __lshift__(self, *args, **kwargs):
191 return _method_proxy(self, "__lshift__", *args, **kwargs)
193 def __rshift__(self, *args, **kwargs):
194 return _method_proxy(self, "__rshift__", *args, **kwargs)
196 def __and__(self, *args, **kwargs):
197 return _method_proxy(self, "__and__", *args, **kwargs)
199 def __or__(self, *args, **kwargs):
200 return _method_proxy(self, "__or__", *args, **kwargs)
202 def __xor__(self, *args, **kwargs):
203 return _method_proxy(self, "__xor__", *args, **kwargs)
205 def __radd__(self, *args, **kwargs):
206 return _method_proxy(self, "__radd__", *args, **kwargs)
208 def __rsub__(self, *args, **kwargs):
209 return _method_proxy(self, "__rsub__", *args, **kwargs)
211 def __rmul__(self, *args, **kwargs):
212 return _method_proxy(self, "__rmul__", *args, **kwargs)
214 def __rfloordiv__(self, *args, **kwargs):
215 return _method_proxy(self, "__rfloordiv__", *args, **kwargs)
217 def __rdiv__(self, *args, **kwargs):
218 return _method_proxy(self, "__rdiv__", *args, **kwargs)
220 def __rtruediv__(self, *args, **kwargs):
221 return _method_proxy(self, "__rtruediv__", *args, **kwargs)
223 def __rmod__(self, *args, **kwargs):
224 return _method_proxy(self, "__rmod__", *args, **kwargs)
226 def __rdivmod__(self, *args, **kwargs):
227 return _method_proxy(self, "__rdivmod__", *args, **kwargs)
229 def __rpow__(self, *args, **kwargs):
230 return _method_proxy(self, "__rpow__", *args, **kwargs)
232 def __rlshift__(self, *args, **kwargs):
233 return _method_proxy(self, "__rlshift__", *args, **kwargs)
235 def __rrshift__(self, *args, **kwargs):
236 return _method_proxy(self, "__rrshift__", *args, **kwargs)
238 def __rand__(self, *args, **kwargs):
239 return _method_proxy(self, "__rand__", *args, **kwargs)
241 def __ror__(self, *args, **kwargs):
242 return _method_proxy(self, "__ror__", *args, **kwargs)
244 def __rxor__(self, *args, **kwargs):
245 return _method_proxy(self, "__rxor__", *args, **kwargs)
247 def __iadd__(self, *args, **kwargs):
248 object.__setattr__(
249 self, "_value", _method_proxy(self, "__add__", *args, **kwargs)
250 )
251 return self
253 def __isub__(self, *args, **kwargs):
254 object.__setattr__(
255 self, "_value", _method_proxy(self, "__sub__", *args, **kwargs)
256 )
257 return self
259 def __imul__(self, *args, **kwargs):
260 object.__setattr__(
261 self, "_value", _method_proxy(self, "__mul__", *args, **kwargs)
262 )
263 return self
265 def __ifloordiv__(self, *args, **kwargs):
266 object.__setattr__(
267 self, "_value", _method_proxy(self, "__floordiv__", *args, **kwargs)
268 )
269 return self
271 def __idiv__(self, *args, **kwargs):
272 object.__setattr__(
273 self, "_value", _method_proxy(self, "__div__", *args, **kwargs)
274 )
275 return self
277 def __itruediv__(self, *args, **kwargs):
278 object.__setattr__(
279 self, "_value", _method_proxy(self, "__truediv__", *args, **kwargs)
280 )
281 return self
283 def __imod__(self, *args, **kwargs):
284 object.__setattr__(
285 self, "_value", _method_proxy(self, "__mod__", *args, **kwargs)
286 )
287 return self
289 def __ipow__(self, *args, **kwargs):
290 object.__setattr__(
291 self, "_value", _method_proxy(self, "__pow__", *args, **kwargs)
292 )
293 return self
295 def __ilshift__(self, *args, **kwargs):
296 object.__setattr__(
297 self, "_value", _method_proxy(self, "__lshift__", *args, **kwargs)
298 )
299 return self
301 def __irshift__(self, *args, **kwargs):
302 object.__setattr__(
303 self, "_value", _method_proxy(self, "__rshift__", *args, **kwargs)
304 )
305 return self
307 def __iand__(self, *args, **kwargs):
308 object.__setattr__(
309 self, "_value", _method_proxy(self, "__and__", *args, **kwargs)
310 )
311 return self
313 def __ior__(self, *args, **kwargs):
314 object.__setattr__(
315 self, "_value", _method_proxy(self, "__or__", *args, **kwargs)
316 )
317 return self
319 def __ixor__(self, *args, **kwargs):
320 object.__setattr__(
321 self, "_value", _method_proxy(self, "__xor__", *args, **kwargs)
322 )
323 return self