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

1from typing import Any, Callable, Optional 

2 

3 

4def _method_proxy(inst: Any, name: str, *args, **kwargs) -> Optional[Any]: 

5 """Proxy the given method to the given object. 

6 

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) 

15 

16 

17class Thunk(object): 

18 """A simple lazy-initialized object proxy.""" 

19 

20 __slots__ = ["_factory", "_value", "_called"] 

21 

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") 

29 

30 object.__setattr__(self, "_factory", _factory) 

31 object.__setattr__(self, "_value", None) 

32 object.__setattr__(self, "_called", False) 

33 

34 def __getattribute__(self, *args, **kwargs): 

35 return _method_proxy(self, "__getattribute__", *args, **kwargs) 

36 

37 def __setattr__(self, *args, **kwargs): 

38 return _method_proxy(self, "__setattr__", *args, **kwargs) 

39 

40 def __delattr__(self, *args, **kwargs): 

41 return _method_proxy(self, "__delattr__", *args, **kwargs) 

42 

43 def __getitem__(self, *args, **kwargs): 

44 return _method_proxy(self, "__getitem__", *args, **kwargs) 

45 

46 def __setitem__(self, *args, **kwargs): 

47 return _method_proxy(self, "__setitem__", *args, **kwargs) 

48 

49 def __delitem__(self, *args, **kwargs): 

50 return _method_proxy(self, "__delitem__", *args, **kwargs) 

51 

52 def __call__(self, *args, **kwargs): 

53 return _method_proxy(self, "__call__", *args, **kwargs) 

54 

55 def __iter__(self, *args, **kwargs): 

56 return _method_proxy(self, "__iter__", *args, **kwargs) 

57 

58 def __reversed__(self, *args, **kwargs): 

59 return _method_proxy(self, "__reversed__", *args, **kwargs) 

60 

61 def __contains__(self, *args, **kwargs): 

62 return _method_proxy(self, "__contains__", *args, **kwargs) 

63 

64 def __missing__(self, *args, **kwargs): 

65 return _method_proxy(self, "__missing__", *args, **kwargs) 

66 

67 def __len__(self, *args, **kwargs): 

68 return _method_proxy(self, "__len__", *args, **kwargs) 

69 

70 def __str__(self, *args, **kwargs): 

71 return _method_proxy(self, "__str__", *args, **kwargs) 

72 

73 def __repr__(self, *args, **kwargs): 

74 return _method_proxy(self, "__repr__", *args, **kwargs) 

75 

76 def __unicode__(self, *args, **kwargs): 

77 return _method_proxy(self, "__unicode__", *args, **kwargs) 

78 

79 def __format__(self, *args, **kwargs): 

80 return _method_proxy(self, "__format__", *args, **kwargs) 

81 

82 def __hash__(self, *args, **kwargs): 

83 return _method_proxy(self, "__hash__", *args, **kwargs) 

84 

85 def __nonzero__(self, *args, **kwargs): 

86 return _method_proxy(self, "__nonzero__", *args, **kwargs) 

87 

88 def __dir__(self, *args, **kwargs): 

89 return _method_proxy(self, "__dir__", *args, **kwargs) 

90 

91 def __sizeof__(self, *args, **kwargs): 

92 return _method_proxy(self, "__sizeof__", *args, **kwargs) 

93 

94 def __int__(self, *args, **kwargs): 

95 return _method_proxy(self, "__int__", *args, **kwargs) 

96 

97 def __long__(self, *args, **kwargs): 

98 return _method_proxy(self, "__long__", *args, **kwargs) 

99 

100 def __float__(self, *args, **kwargs): 

101 return _method_proxy(self, "__float__", *args, **kwargs) 

102 

103 def __complex__(self, *args, **kwargs): 

104 return _method_proxy(self, "__complex__", *args, **kwargs) 

105 

106 def __oct__(self, *args, **kwargs): 

107 return _method_proxy(self, "__oct__", *args, **kwargs) 

108 

109 def __hex__(self, *args, **kwargs): 

110 return _method_proxy(self, "__hex__", *args, **kwargs) 

111 

112 def __index__(self, *args, **kwargs): 

113 return _method_proxy(self, "__index__", *args, **kwargs) 

114 

115 def __trunc__(self, *args, **kwargs): 

116 return _method_proxy(self, "__trunc__", *args, **kwargs) 

117 

118 def __coerce__(self, *args, **kwargs): 

119 return _method_proxy(self, "__coerce__", *args, **kwargs) 

120 

121 def __cmp__(self, *args, **kwargs): 

122 return _method_proxy(self, "__cmp__", *args, **kwargs) 

123 

124 def __eq__(self, *args, **kwargs): 

125 return _method_proxy(self, "__eq__", *args, **kwargs) 

126 

127 def __ne__(self, *args, **kwargs): 

128 return _method_proxy(self, "__ne__", *args, **kwargs) 

129 

130 def __lt__(self, *args, **kwargs): 

131 return _method_proxy(self, "__lt__", *args, **kwargs) 

132 

133 def __gt__(self, *args, **kwargs): 

134 return _method_proxy(self, "__gt__", *args, **kwargs) 

135 

136 def __le__(self, *args, **kwargs): 

137 return _method_proxy(self, "__le__", *args, **kwargs) 

138 

139 def __ge__(self, *args, **kwargs): 

140 return _method_proxy(self, "__ge__", *args, **kwargs) 

141 

142 def __pos__(self, *args, **kwargs): 

143 return _method_proxy(self, "__pos__", *args, **kwargs) 

144 

145 def __neg__(self, *args, **kwargs): 

146 return _method_proxy(self, "__neg__", *args, **kwargs) 

147 

148 def __abs__(self, *args, **kwargs): 

149 return _method_proxy(self, "__abs__", *args, **kwargs) 

150 

151 def __invert__(self, *args, **kwargs): 

152 return _method_proxy(self, "__invert__", *args, **kwargs) 

153 

154 def __round__(self, *args, **kwargs): 

155 return _method_proxy(self, "__round__", *args, **kwargs) 

156 

157 def __floor__(self, *args, **kwargs): 

158 return _method_proxy(self, "__floor__", *args, **kwargs) 

159 

160 def __ceil__(self, *args, **kwargs): 

161 return _method_proxy(self, "__ceil__", *args, **kwargs) 

162 

163 def __add__(self, *args, **kwargs): 

164 return _method_proxy(self, "__add__", *args, **kwargs) 

165 

166 def __sub__(self, *args, **kwargs): 

167 return _method_proxy(self, "__sub__", *args, **kwargs) 

168 

169 def __mul__(self, *args, **kwargs): 

170 return _method_proxy(self, "__mul__", *args, **kwargs) 

171 

172 def __floordiv__(self, *args, **kwargs): 

173 return _method_proxy(self, "__floordiv__", *args, **kwargs) 

174 

175 def __div__(self, *args, **kwargs): 

176 return _method_proxy(self, "__div__", *args, **kwargs) 

177 

178 def __truediv__(self, *args, **kwargs): 

179 return _method_proxy(self, "__truediv__", *args, **kwargs) 

180 

181 def __mod__(self, *args, **kwargs): 

182 return _method_proxy(self, "__mod__", *args, **kwargs) 

183 

184 def __divmod__(self, *args, **kwargs): 

185 return _method_proxy(self, "__divmod__", *args, **kwargs) 

186 

187 def __pow__(self, *args, **kwargs): 

188 return _method_proxy(self, "__pow__", *args, **kwargs) 

189 

190 def __lshift__(self, *args, **kwargs): 

191 return _method_proxy(self, "__lshift__", *args, **kwargs) 

192 

193 def __rshift__(self, *args, **kwargs): 

194 return _method_proxy(self, "__rshift__", *args, **kwargs) 

195 

196 def __and__(self, *args, **kwargs): 

197 return _method_proxy(self, "__and__", *args, **kwargs) 

198 

199 def __or__(self, *args, **kwargs): 

200 return _method_proxy(self, "__or__", *args, **kwargs) 

201 

202 def __xor__(self, *args, **kwargs): 

203 return _method_proxy(self, "__xor__", *args, **kwargs) 

204 

205 def __radd__(self, *args, **kwargs): 

206 return _method_proxy(self, "__radd__", *args, **kwargs) 

207 

208 def __rsub__(self, *args, **kwargs): 

209 return _method_proxy(self, "__rsub__", *args, **kwargs) 

210 

211 def __rmul__(self, *args, **kwargs): 

212 return _method_proxy(self, "__rmul__", *args, **kwargs) 

213 

214 def __rfloordiv__(self, *args, **kwargs): 

215 return _method_proxy(self, "__rfloordiv__", *args, **kwargs) 

216 

217 def __rdiv__(self, *args, **kwargs): 

218 return _method_proxy(self, "__rdiv__", *args, **kwargs) 

219 

220 def __rtruediv__(self, *args, **kwargs): 

221 return _method_proxy(self, "__rtruediv__", *args, **kwargs) 

222 

223 def __rmod__(self, *args, **kwargs): 

224 return _method_proxy(self, "__rmod__", *args, **kwargs) 

225 

226 def __rdivmod__(self, *args, **kwargs): 

227 return _method_proxy(self, "__rdivmod__", *args, **kwargs) 

228 

229 def __rpow__(self, *args, **kwargs): 

230 return _method_proxy(self, "__rpow__", *args, **kwargs) 

231 

232 def __rlshift__(self, *args, **kwargs): 

233 return _method_proxy(self, "__rlshift__", *args, **kwargs) 

234 

235 def __rrshift__(self, *args, **kwargs): 

236 return _method_proxy(self, "__rrshift__", *args, **kwargs) 

237 

238 def __rand__(self, *args, **kwargs): 

239 return _method_proxy(self, "__rand__", *args, **kwargs) 

240 

241 def __ror__(self, *args, **kwargs): 

242 return _method_proxy(self, "__ror__", *args, **kwargs) 

243 

244 def __rxor__(self, *args, **kwargs): 

245 return _method_proxy(self, "__rxor__", *args, **kwargs) 

246 

247 def __iadd__(self, *args, **kwargs): 

248 object.__setattr__( 

249 self, "_value", _method_proxy(self, "__add__", *args, **kwargs) 

250 ) 

251 return self 

252 

253 def __isub__(self, *args, **kwargs): 

254 object.__setattr__( 

255 self, "_value", _method_proxy(self, "__sub__", *args, **kwargs) 

256 ) 

257 return self 

258 

259 def __imul__(self, *args, **kwargs): 

260 object.__setattr__( 

261 self, "_value", _method_proxy(self, "__mul__", *args, **kwargs) 

262 ) 

263 return self 

264 

265 def __ifloordiv__(self, *args, **kwargs): 

266 object.__setattr__( 

267 self, "_value", _method_proxy(self, "__floordiv__", *args, **kwargs) 

268 ) 

269 return self 

270 

271 def __idiv__(self, *args, **kwargs): 

272 object.__setattr__( 

273 self, "_value", _method_proxy(self, "__div__", *args, **kwargs) 

274 ) 

275 return self 

276 

277 def __itruediv__(self, *args, **kwargs): 

278 object.__setattr__( 

279 self, "_value", _method_proxy(self, "__truediv__", *args, **kwargs) 

280 ) 

281 return self 

282 

283 def __imod__(self, *args, **kwargs): 

284 object.__setattr__( 

285 self, "_value", _method_proxy(self, "__mod__", *args, **kwargs) 

286 ) 

287 return self 

288 

289 def __ipow__(self, *args, **kwargs): 

290 object.__setattr__( 

291 self, "_value", _method_proxy(self, "__pow__", *args, **kwargs) 

292 ) 

293 return self 

294 

295 def __ilshift__(self, *args, **kwargs): 

296 object.__setattr__( 

297 self, "_value", _method_proxy(self, "__lshift__", *args, **kwargs) 

298 ) 

299 return self 

300 

301 def __irshift__(self, *args, **kwargs): 

302 object.__setattr__( 

303 self, "_value", _method_proxy(self, "__rshift__", *args, **kwargs) 

304 ) 

305 return self 

306 

307 def __iand__(self, *args, **kwargs): 

308 object.__setattr__( 

309 self, "_value", _method_proxy(self, "__and__", *args, **kwargs) 

310 ) 

311 return self 

312 

313 def __ior__(self, *args, **kwargs): 

314 object.__setattr__( 

315 self, "_value", _method_proxy(self, "__or__", *args, **kwargs) 

316 ) 

317 return self 

318 

319 def __ixor__(self, *args, **kwargs): 

320 object.__setattr__( 

321 self, "_value", _method_proxy(self, "__xor__", *args, **kwargs) 

322 ) 

323 return self