blob: 9495fbe56eba39cef4b60f32205ce3c2a1d0474a [file] [log] [blame]
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001"""functools.py - Tools for working with functions and callable objects
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002"""
3# Python module wrapper for _functools C module
4# to allow utilities written in Python to be added
5# to the functools module.
Łukasz Langa6f692512013-06-05 12:20:24 +02006# Written by Nick Coghlan <ncoghlan at gmail.com>,
7# Raymond Hettinger <python at rcn.com>,
8# and Łukasz Langa <lukasz at langa.pl>.
9# Copyright (C) 2006-2013 Python Software Foundation.
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000010# See C source code for _functools credits/copyright
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000011
Georg Brandl2e7346a2010-07-31 18:09:23 +000012__all__ = ['update_wrapper', 'wraps', 'WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES',
Łukasz Langa6f692512013-06-05 12:20:24 +020013 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', 'partial',
Ethan Smithc6512752018-05-26 16:38:33 -040014 'partialmethod', 'singledispatch', 'singledispatchmethod']
Georg Brandl2e7346a2010-07-31 18:09:23 +000015
Łukasz Langa6f692512013-06-05 12:20:24 +020016from abc import get_cache_token
Raymond Hettingerec0e9102012-03-16 01:16:31 -070017from collections import namedtuple
INADA Naoki9811e802017-09-30 16:13:02 +090018# import types, weakref # Deferred to single_dispatch()
Nick Coghlan457fc9a2016-09-10 20:00:02 +100019from reprlib import recursive_repr
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020020from _thread import RLock
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000021
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -070022
23################################################################################
24### update_wrapper() and wraps() decorator
25################################################################################
26
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000027# update_wrapper() and wraps() are tools to help write
28# wrapper functions that can handle naive introspection
29
Meador Ingeff7f64c2011-12-11 22:37:31 -060030WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__qualname__', '__doc__',
31 '__annotations__')
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000032WRAPPER_UPDATES = ('__dict__',)
33def update_wrapper(wrapper,
34 wrapped,
35 assigned = WRAPPER_ASSIGNMENTS,
36 updated = WRAPPER_UPDATES):
37 """Update a wrapper function to look like the wrapped function
38
39 wrapper is the function to be updated
40 wrapped is the original function
41 assigned is a tuple naming the attributes assigned directly
42 from the wrapped function to the wrapper function (defaults to
43 functools.WRAPPER_ASSIGNMENTS)
Thomas Wouters89f507f2006-12-13 04:49:30 +000044 updated is a tuple naming the attributes of the wrapper that
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000045 are updated with the corresponding attribute from the wrapped
46 function (defaults to functools.WRAPPER_UPDATES)
47 """
48 for attr in assigned:
Nick Coghlan98876832010-08-17 06:17:18 +000049 try:
50 value = getattr(wrapped, attr)
51 except AttributeError:
52 pass
53 else:
54 setattr(wrapper, attr, value)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000055 for attr in updated:
Thomas Wouters89f507f2006-12-13 04:49:30 +000056 getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
Nick Coghlan24c05bc2013-07-15 21:13:08 +100057 # Issue #17482: set __wrapped__ last so we don't inadvertently copy it
58 # from the wrapped function when updating __dict__
59 wrapper.__wrapped__ = wrapped
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000060 # Return the wrapper so this can be used as a decorator via partial()
61 return wrapper
62
63def wraps(wrapped,
64 assigned = WRAPPER_ASSIGNMENTS,
65 updated = WRAPPER_UPDATES):
66 """Decorator factory to apply update_wrapper() to a wrapper function
67
68 Returns a decorator that invokes update_wrapper() with the decorated
69 function as the wrapper argument and the arguments to wraps() as the
70 remaining arguments. Default arguments are as for update_wrapper().
71 This is a convenience function to simplify applying partial() to
72 update_wrapper().
73 """
74 return partial(update_wrapper, wrapped=wrapped,
75 assigned=assigned, updated=updated)
Raymond Hettingerc50846a2010-04-05 18:56:31 +000076
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -070077
78################################################################################
79### total_ordering class decorator
80################################################################################
81
Raymond Hettinger0603d302015-01-05 21:52:10 -080082# The total ordering functions all invoke the root magic method directly
83# rather than using the corresponding operator. This avoids possible
84# infinite recursion that could occur when the operator dispatch logic
85# detects a NotImplemented result and then calls a reflected method.
Nick Coghlanf05d9812013-10-02 00:02:03 +100086
Raymond Hettingerffcd8492015-05-12 21:26:37 -070087def _gt_from_lt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -080088 'Return a > b. Computed by @total_ordering from (not a < b) and (a != b).'
89 op_result = self.__lt__(other)
Nick Coghlanf05d9812013-10-02 00:02:03 +100090 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -080091 return op_result
Nick Coghlanf05d9812013-10-02 00:02:03 +100092 return not op_result and self != other
93
Raymond Hettingerffcd8492015-05-12 21:26:37 -070094def _le_from_lt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -080095 'Return a <= b. Computed by @total_ordering from (a < b) or (a == b).'
96 op_result = self.__lt__(other)
97 return op_result or self == other
98
Raymond Hettingerffcd8492015-05-12 21:26:37 -070099def _ge_from_lt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800100 'Return a >= b. Computed by @total_ordering from (not a < b).'
101 op_result = self.__lt__(other)
102 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800103 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800104 return not op_result
105
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700106def _ge_from_le(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800107 'Return a >= b. Computed by @total_ordering from (not a <= b) or (a == b).'
108 op_result = self.__le__(other)
Nick Coghlanf05d9812013-10-02 00:02:03 +1000109 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800110 return op_result
Nick Coghlanf05d9812013-10-02 00:02:03 +1000111 return not op_result or self == other
112
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700113def _lt_from_le(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800114 'Return a < b. Computed by @total_ordering from (a <= b) and (a != b).'
115 op_result = self.__le__(other)
Nick Coghlanf05d9812013-10-02 00:02:03 +1000116 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800117 return op_result
Nick Coghlanf05d9812013-10-02 00:02:03 +1000118 return op_result and self != other
119
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700120def _gt_from_le(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800121 'Return a > b. Computed by @total_ordering from (not a <= b).'
122 op_result = self.__le__(other)
123 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800124 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800125 return not op_result
126
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700127def _lt_from_gt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800128 'Return a < b. Computed by @total_ordering from (not a > b) and (a != b).'
129 op_result = self.__gt__(other)
130 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800131 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800132 return not op_result and self != other
133
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700134def _ge_from_gt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800135 'Return a >= b. Computed by @total_ordering from (a > b) or (a == b).'
136 op_result = self.__gt__(other)
137 return op_result or self == other
138
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700139def _le_from_gt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800140 'Return a <= b. Computed by @total_ordering from (not a > b).'
141 op_result = self.__gt__(other)
142 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800143 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800144 return not op_result
145
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700146def _le_from_ge(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800147 'Return a <= b. Computed by @total_ordering from (not a >= b) or (a == b).'
148 op_result = self.__ge__(other)
149 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800150 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800151 return not op_result or self == other
152
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700153def _gt_from_ge(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800154 'Return a > b. Computed by @total_ordering from (a >= b) and (a != b).'
155 op_result = self.__ge__(other)
156 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800157 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800158 return op_result and self != other
159
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700160def _lt_from_ge(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800161 'Return a < b. Computed by @total_ordering from (not a >= b).'
162 op_result = self.__ge__(other)
163 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800164 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800165 return not op_result
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000166
Raymond Hettinger1a8ada82015-01-13 22:57:35 -0800167_convert = {
168 '__lt__': [('__gt__', _gt_from_lt),
169 ('__le__', _le_from_lt),
170 ('__ge__', _ge_from_lt)],
171 '__le__': [('__ge__', _ge_from_le),
172 ('__lt__', _lt_from_le),
173 ('__gt__', _gt_from_le)],
174 '__gt__': [('__lt__', _lt_from_gt),
175 ('__ge__', _ge_from_gt),
176 ('__le__', _le_from_gt)],
177 '__ge__': [('__le__', _le_from_ge),
178 ('__gt__', _gt_from_ge),
179 ('__lt__', _lt_from_ge)]
180}
181
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000182def total_ordering(cls):
Georg Brandle5a26732010-05-19 21:06:36 +0000183 """Class decorator that fills in missing ordering methods"""
Raymond Hettinger3255c632010-09-16 00:31:21 +0000184 # Find user-defined comparisons (not those inherited from object).
Raymond Hettinger15ce0be2017-09-05 09:40:44 -0700185 roots = {op for op in _convert if getattr(cls, op, None) is not getattr(object, op, None)}
Raymond Hettinger56de7e22010-04-10 16:59:03 +0000186 if not roots:
187 raise ValueError('must define at least one ordering operation: < > <= >=')
188 root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__
Raymond Hettinger1a8ada82015-01-13 22:57:35 -0800189 for opname, opfunc in _convert[root]:
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000190 if opname not in roots:
191 opfunc.__name__ = opname
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000192 setattr(cls, opname, opfunc)
193 return cls
194
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700195
196################################################################################
197### cmp_to_key() function converter
198################################################################################
199
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000200def cmp_to_key(mycmp):
Georg Brandle5a26732010-05-19 21:06:36 +0000201 """Convert a cmp= function into a key= function"""
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000202 class K(object):
Raymond Hettingera0d1d962011-03-21 17:50:28 -0700203 __slots__ = ['obj']
Raymond Hettinger7ab9e222011-04-05 02:33:54 -0700204 def __init__(self, obj):
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000205 self.obj = obj
206 def __lt__(self, other):
207 return mycmp(self.obj, other.obj) < 0
208 def __gt__(self, other):
209 return mycmp(self.obj, other.obj) > 0
210 def __eq__(self, other):
211 return mycmp(self.obj, other.obj) == 0
212 def __le__(self, other):
213 return mycmp(self.obj, other.obj) <= 0
214 def __ge__(self, other):
215 return mycmp(self.obj, other.obj) >= 0
Raymond Hettinger003be522011-05-03 11:01:32 -0700216 __hash__ = None
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000217 return K
Georg Brandl2e7346a2010-07-31 18:09:23 +0000218
Raymond Hettinger7ab9e222011-04-05 02:33:54 -0700219try:
220 from _functools import cmp_to_key
Brett Cannoncd171c82013-07-04 17:43:24 -0400221except ImportError:
Raymond Hettinger7ab9e222011-04-05 02:33:54 -0700222 pass
223
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700224
225################################################################################
madman-bobe25d5fc2018-10-25 15:02:10 +0100226### reduce() sequence to a single item
227################################################################################
228
229_initial_missing = object()
230
231def reduce(function, sequence, initial=_initial_missing):
232 """
233 reduce(function, sequence[, initial]) -> value
234
235 Apply a function of two arguments cumulatively to the items of a sequence,
236 from left to right, so as to reduce the sequence to a single value.
237 For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
238 ((((1+2)+3)+4)+5). If initial is present, it is placed before the items
239 of the sequence in the calculation, and serves as a default when the
240 sequence is empty.
241 """
242
243 it = iter(sequence)
244
245 if initial is _initial_missing:
246 try:
247 value = next(it)
248 except StopIteration:
249 raise TypeError("reduce() of empty sequence with no initial value") from None
250 else:
251 value = initial
252
253 for element in it:
254 value = function(value, element)
255
256 return value
257
258try:
259 from _functools import reduce
260except ImportError:
261 pass
262
263
264################################################################################
Antoine Pitroub5b37142012-11-13 21:35:40 +0100265### partial() argument application
266################################################################################
267
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000268# Purely functional, no descriptor behaviour
Nick Coghlan457fc9a2016-09-10 20:00:02 +1000269class partial:
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000270 """New function with partial application of the given arguments
Antoine Pitroub5b37142012-11-13 21:35:40 +0100271 and keywords.
272 """
Alexander Belopolskye49af342015-03-01 15:08:17 -0500273
Nick Coghlan457fc9a2016-09-10 20:00:02 +1000274 __slots__ = "func", "args", "keywords", "__dict__", "__weakref__"
275
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300276 def __new__(cls, func, /, *args, **keywords):
Nick Coghlan457fc9a2016-09-10 20:00:02 +1000277 if not callable(func):
278 raise TypeError("the first argument must be callable")
Nick Coghlan457fc9a2016-09-10 20:00:02 +1000279
280 if hasattr(func, "func"):
281 args = func.args + args
Serhiy Storchakada084702019-03-27 08:02:28 +0200282 keywords = {**func.keywords, **keywords}
Nick Coghlan457fc9a2016-09-10 20:00:02 +1000283 func = func.func
284
285 self = super(partial, cls).__new__(cls)
286
287 self.func = func
288 self.args = args
289 self.keywords = keywords
290 return self
291
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300292 def __call__(self, /, *args, **keywords):
Serhiy Storchakada084702019-03-27 08:02:28 +0200293 keywords = {**self.keywords, **keywords}
294 return self.func(*self.args, *args, **keywords)
Nick Coghlan457fc9a2016-09-10 20:00:02 +1000295
296 @recursive_repr()
297 def __repr__(self):
298 qualname = type(self).__qualname__
299 args = [repr(self.func)]
300 args.extend(repr(x) for x in self.args)
301 args.extend(f"{k}={v!r}" for (k, v) in self.keywords.items())
302 if type(self).__module__ == "functools":
303 return f"functools.{qualname}({', '.join(args)})"
304 return f"{qualname}({', '.join(args)})"
305
306 def __reduce__(self):
307 return type(self), (self.func,), (self.func, self.args,
308 self.keywords or None, self.__dict__ or None)
309
310 def __setstate__(self, state):
311 if not isinstance(state, tuple):
312 raise TypeError("argument to __setstate__ must be a tuple")
313 if len(state) != 4:
314 raise TypeError(f"expected 4 items in state, got {len(state)}")
315 func, args, kwds, namespace = state
316 if (not callable(func) or not isinstance(args, tuple) or
317 (kwds is not None and not isinstance(kwds, dict)) or
318 (namespace is not None and not isinstance(namespace, dict))):
319 raise TypeError("invalid partial state")
320
321 args = tuple(args) # just in case it's a subclass
322 if kwds is None:
323 kwds = {}
324 elif type(kwds) is not dict: # XXX does it need to be *exactly* dict?
325 kwds = dict(kwds)
326 if namespace is None:
327 namespace = {}
328
329 self.__dict__ = namespace
330 self.func = func
331 self.args = args
332 self.keywords = kwds
Antoine Pitroub5b37142012-11-13 21:35:40 +0100333
334try:
335 from _functools import partial
Brett Cannoncd171c82013-07-04 17:43:24 -0400336except ImportError:
Antoine Pitroub5b37142012-11-13 21:35:40 +0100337 pass
338
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000339# Descriptor version
340class partialmethod(object):
341 """Method descriptor with partial application of the given arguments
342 and keywords.
343
344 Supports wrapping existing descriptors and handles non-descriptor
345 callables as instance methods.
346 """
347
Serhiy Storchaka142566c2019-06-05 18:22:31 +0300348 def __init__(self, func, /, *args, **keywords):
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000349 if not callable(func) and not hasattr(func, "__get__"):
350 raise TypeError("{!r} is not callable or a descriptor"
351 .format(func))
352
353 # func could be a descriptor like classmethod which isn't callable,
354 # so we can't inherit from partial (it verifies func is callable)
355 if isinstance(func, partialmethod):
356 # flattening is mandatory in order to place cls/self before all
357 # other arguments
358 # it's also more efficient since only one function will be called
359 self.func = func.func
360 self.args = func.args + args
Serhiy Storchakada084702019-03-27 08:02:28 +0200361 self.keywords = {**func.keywords, **keywords}
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000362 else:
363 self.func = func
364 self.args = args
365 self.keywords = keywords
366
367 def __repr__(self):
368 args = ", ".join(map(repr, self.args))
369 keywords = ", ".join("{}={!r}".format(k, v)
370 for k, v in self.keywords.items())
371 format_string = "{module}.{cls}({func}, {args}, {keywords})"
372 return format_string.format(module=self.__class__.__module__,
Serhiy Storchaka521e5862014-07-22 15:00:37 +0300373 cls=self.__class__.__qualname__,
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000374 func=self.func,
375 args=args,
376 keywords=keywords)
377
378 def _make_unbound_method(self):
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300379 def _method(cls_or_self, /, *args, **keywords):
Serhiy Storchakada084702019-03-27 08:02:28 +0200380 keywords = {**self.keywords, **keywords}
381 return self.func(cls_or_self, *self.args, *args, **keywords)
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000382 _method.__isabstractmethod__ = self.__isabstractmethod__
Yury Selivanovda5fe4f2014-01-27 17:28:37 -0500383 _method._partialmethod = self
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000384 return _method
385
386 def __get__(self, obj, cls):
387 get = getattr(self.func, "__get__", None)
388 result = None
389 if get is not None:
390 new_func = get(obj, cls)
391 if new_func is not self.func:
392 # Assume __get__ returning something new indicates the
393 # creation of an appropriate callable
394 result = partial(new_func, *self.args, **self.keywords)
395 try:
396 result.__self__ = new_func.__self__
397 except AttributeError:
398 pass
399 if result is None:
400 # If the underlying descriptor didn't do anything, treat this
401 # like an instance method
402 result = self._make_unbound_method().__get__(obj, cls)
403 return result
404
405 @property
406 def __isabstractmethod__(self):
407 return getattr(self.func, "__isabstractmethod__", False)
408
Pablo Galindo7cd25432018-10-26 12:19:14 +0100409# Helper functions
410
411def _unwrap_partial(func):
412 while isinstance(func, partial):
413 func = func.func
414 return func
Antoine Pitroub5b37142012-11-13 21:35:40 +0100415
416################################################################################
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700417### LRU Cache function decorator
418################################################################################
419
Raymond Hettingerdce583e2012-03-16 22:12:20 -0700420_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])
Nick Coghlan234515a2010-11-30 06:19:46 +0000421
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700422class _HashedSeq(list):
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700423 """ This class guarantees that hash() will be called no more than once
424 per element. This is important because the lru_cache() will hash
425 the key multiple times on a cache miss.
426
427 """
428
Raymond Hettinger9acbb602012-04-30 22:32:16 -0700429 __slots__ = 'hashvalue'
430
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700431 def __init__(self, tup, hash=hash):
432 self[:] = tup
433 self.hashvalue = hash(tup)
Raymond Hettinger9acbb602012-04-30 22:32:16 -0700434
435 def __hash__(self):
436 return self.hashvalue
437
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700438def _make_key(args, kwds, typed,
439 kwd_mark = (object(),),
Raymond Hettingerd8080c02019-01-26 03:02:00 -0500440 fasttypes = {int, str},
Raymond Hettinger4ee39142017-01-08 17:28:20 -0800441 tuple=tuple, type=type, len=len):
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700442 """Make a cache key from optionally typed positional and keyword arguments
443
444 The key is constructed in a way that is flat as possible rather than
445 as a nested structure that would take more memory.
446
447 If there is only a single argument and its data type is known to cache
448 its hash value, then that argument is returned without a wrapper. This
449 saves space and improves lookup speed.
450
451 """
Raymond Hettinger55037092017-09-04 17:47:53 -0700452 # All of code below relies on kwds preserving the order input by the user.
453 # Formerly, we sorted() the kwds before looping. The new way is *much*
454 # faster; however, it means that f(x=1, y=2) will now be treated as a
455 # distinct call from f(y=2, x=1) which will be cached separately.
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700456 key = args
457 if kwds:
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700458 key += kwd_mark
Raymond Hettinger4ee39142017-01-08 17:28:20 -0800459 for item in kwds.items():
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700460 key += item
461 if typed:
462 key += tuple(type(v) for v in args)
463 if kwds:
Raymond Hettinger4ee39142017-01-08 17:28:20 -0800464 key += tuple(type(v) for v in kwds.values())
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700465 elif len(key) == 1 and type(key[0]) in fasttypes:
466 return key[0]
467 return _HashedSeq(key)
468
Raymond Hettinger010ce322012-05-19 21:20:48 -0700469def lru_cache(maxsize=128, typed=False):
Benjamin Peterson1f594ad2010-08-08 13:17:07 +0000470 """Least-recently-used cache decorator.
Georg Brandl2e7346a2010-07-31 18:09:23 +0000471
Raymond Hettingerc79fb0e2010-12-01 03:45:41 +0000472 If *maxsize* is set to None, the LRU features are disabled and the cache
473 can grow without bound.
474
Raymond Hettingercd9fdfd2011-10-20 08:57:45 -0700475 If *typed* is True, arguments of different types will be cached separately.
476 For example, f(3.0) and f(3) will be treated as distinct calls with
477 distinct results.
478
Georg Brandl2e7346a2010-07-31 18:09:23 +0000479 Arguments to the cached function must be hashable.
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000480
Raymond Hettinger7f7a5a72012-03-30 21:50:40 -0700481 View the cache statistics named tuple (hits, misses, maxsize, currsize)
482 with f.cache_info(). Clear the cache and statistics with f.cache_clear().
Raymond Hettinger00f2f972010-12-01 00:47:56 +0000483 Access the underlying function with f.__wrapped__.
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000484
485 See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used
Georg Brandl2e7346a2010-07-31 18:09:23 +0000486
Benjamin Peterson1f594ad2010-08-08 13:17:07 +0000487 """
Raymond Hettinger1ff50df2012-03-30 13:15:48 -0700488
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000489 # Users should only access the lru_cache through its public API:
Raymond Hettinger5e20bab2010-11-30 07:13:04 +0000490 # cache_info, cache_clear, and f.__wrapped__
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000491 # The internals of the lru_cache are encapsulated for thread safety and
492 # to allow the implementation to change (including a possible C version).
493
Raymond Hettingerd8080c02019-01-26 03:02:00 -0500494 if isinstance(maxsize, int):
Raymond Hettingerb8218682019-05-26 11:27:35 -0700495 # Negative maxsize is treated as 0
Raymond Hettingerd8080c02019-01-26 03:02:00 -0500496 if maxsize < 0:
497 maxsize = 0
Raymond Hettingerb8218682019-05-26 11:27:35 -0700498 elif callable(maxsize) and isinstance(typed, bool):
499 # The user_function was passed in directly via the maxsize argument
500 user_function, maxsize = maxsize, 128
501 wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo)
502 return update_wrapper(wrapper, user_function)
Raymond Hettingerd8080c02019-01-26 03:02:00 -0500503 elif maxsize is not None:
Raymond Hettingerb8218682019-05-26 11:27:35 -0700504 raise TypeError(
505 'Expected first argument to be an integer, a callable, or None')
Raymond Hettinger4d588972014-08-12 12:44:52 -0700506
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300507 def decorating_function(user_function):
508 wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo)
509 return update_wrapper(wrapper, user_function)
510
511 return decorating_function
512
513def _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo):
Raymond Hettinger9f0ab9f2012-04-29 14:55:27 -0700514 # Constants shared by all lru cache instances:
Raymond Hettingerb6b98c02012-04-29 18:09:02 -0700515 sentinel = object() # unique object used to signal cache misses
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700516 make_key = _make_key # build a key from the function arguments
Raymond Hettinger9f0ab9f2012-04-29 14:55:27 -0700517 PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields
518
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300519 cache = {}
520 hits = misses = 0
521 full = False
522 cache_get = cache.get # bound method to lookup a key or return None
Raymond Hettingerb2d4b3d2016-12-16 14:59:37 -0800523 cache_len = cache.__len__ # get cache size without calling len()
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300524 lock = RLock() # because linkedlist updates aren't threadsafe
525 root = [] # root of the circular doubly linked list
526 root[:] = [root, root, None, None] # initialize by pointing to self
Raymond Hettinger6e8c8172012-03-16 16:53:05 -0700527
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300528 if maxsize == 0:
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700529
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300530 def wrapper(*args, **kwds):
Raymond Hettingerffdf1c32019-01-31 15:03:38 -0800531 # No caching -- just a statistics update
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300532 nonlocal misses
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300533 misses += 1
Raymond Hettingerffdf1c32019-01-31 15:03:38 -0800534 result = user_function(*args, **kwds)
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300535 return result
536
537 elif maxsize is None:
538
539 def wrapper(*args, **kwds):
540 # Simple caching without ordering or size limit
541 nonlocal hits, misses
542 key = make_key(args, kwds, typed)
543 result = cache_get(key, sentinel)
544 if result is not sentinel:
545 hits += 1
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700546 return result
Raymond Hettingerffdf1c32019-01-31 15:03:38 -0800547 misses += 1
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300548 result = user_function(*args, **kwds)
549 cache[key] = result
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300550 return result
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700551
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300552 else:
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700553
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300554 def wrapper(*args, **kwds):
555 # Size limited caching that tracks accesses by recency
556 nonlocal root, hits, misses, full
557 key = make_key(args, kwds, typed)
558 with lock:
559 link = cache_get(key)
560 if link is not None:
561 # Move the link to the front of the circular queue
562 link_prev, link_next, _key, result = link
563 link_prev[NEXT] = link_next
564 link_next[PREV] = link_prev
565 last = root[PREV]
566 last[NEXT] = root[PREV] = link
567 link[PREV] = last
568 link[NEXT] = root
Nick Coghlan234515a2010-11-30 06:19:46 +0000569 hits += 1
Raymond Hettinger4b779b32011-10-15 23:50:42 -0700570 return result
Raymond Hettingerd8080c02019-01-26 03:02:00 -0500571 misses += 1
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300572 result = user_function(*args, **kwds)
573 with lock:
574 if key in cache:
575 # Getting here means that this same key was added to the
576 # cache while the lock was released. Since the link
577 # update is already done, we need only return the
578 # computed result and update the count of misses.
579 pass
580 elif full:
581 # Use the old root to store the new key and result.
582 oldroot = root
583 oldroot[KEY] = key
584 oldroot[RESULT] = result
585 # Empty the oldest link and make it the new root.
586 # Keep a reference to the old key and old result to
587 # prevent their ref counts from going to zero during the
588 # update. That will prevent potentially arbitrary object
589 # clean-up code (i.e. __del__) from running while we're
590 # still adjusting the links.
591 root = oldroot[NEXT]
592 oldkey = root[KEY]
593 oldresult = root[RESULT]
594 root[KEY] = root[RESULT] = None
595 # Now update the cache dictionary.
596 del cache[oldkey]
597 # Save the potentially reentrant cache[key] assignment
598 # for last, after the root and links have been put in
599 # a consistent state.
600 cache[key] = oldroot
601 else:
602 # Put result in a new link at the front of the queue.
603 last = root[PREV]
604 link = [last, root, key, result]
605 last[NEXT] = root[PREV] = cache[key] = link
Raymond Hettingerb2d4b3d2016-12-16 14:59:37 -0800606 # Use the cache_len bound method instead of the len() function
Raymond Hettingeraf56e0e2016-12-16 13:57:40 -0800607 # which could potentially be wrapped in an lru_cache itself.
Raymond Hettingerb2d4b3d2016-12-16 14:59:37 -0800608 full = (cache_len() >= maxsize)
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300609 return result
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700610
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300611 def cache_info():
612 """Report cache statistics"""
613 with lock:
Raymond Hettingerb2d4b3d2016-12-16 14:59:37 -0800614 return _CacheInfo(hits, misses, maxsize, cache_len())
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700615
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300616 def cache_clear():
617 """Clear the cache and cache statistics"""
618 nonlocal hits, misses, full
619 with lock:
620 cache.clear()
621 root[:] = [root, root, None, None]
622 hits = misses = 0
623 full = False
Georg Brandl2e7346a2010-07-31 18:09:23 +0000624
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300625 wrapper.cache_info = cache_info
626 wrapper.cache_clear = cache_clear
Serhiy Storchakace2295d2015-10-24 09:51:53 +0300627 return wrapper
Nick Coghlan234515a2010-11-30 06:19:46 +0000628
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300629try:
630 from _functools import _lru_cache_wrapper
631except ImportError:
632 pass
Łukasz Langa6f692512013-06-05 12:20:24 +0200633
634
635################################################################################
636### singledispatch() - single-dispatch generic function decorator
637################################################################################
638
Łukasz Langa3720c772013-07-01 16:00:38 +0200639def _c3_merge(sequences):
640 """Merges MROs in *sequences* to a single MRO using the C3 algorithm.
641
642 Adapted from http://www.python.org/download/releases/2.3/mro/.
643
644 """
645 result = []
646 while True:
647 sequences = [s for s in sequences if s] # purge empty sequences
648 if not sequences:
649 return result
650 for s1 in sequences: # find merge candidates among seq heads
651 candidate = s1[0]
652 for s2 in sequences:
653 if candidate in s2[1:]:
654 candidate = None
655 break # reject the current head, it appears later
656 else:
657 break
Yury Selivanov77a8cd62015-08-18 14:20:00 -0400658 if candidate is None:
Łukasz Langa3720c772013-07-01 16:00:38 +0200659 raise RuntimeError("Inconsistent hierarchy")
660 result.append(candidate)
661 # remove the chosen candidate
662 for seq in sequences:
663 if seq[0] == candidate:
664 del seq[0]
665
666def _c3_mro(cls, abcs=None):
667 """Computes the method resolution order using extended C3 linearization.
668
669 If no *abcs* are given, the algorithm works exactly like the built-in C3
670 linearization used for method resolution.
671
672 If given, *abcs* is a list of abstract base classes that should be inserted
673 into the resulting MRO. Unrelated ABCs are ignored and don't end up in the
674 result. The algorithm inserts ABCs where their functionality is introduced,
675 i.e. issubclass(cls, abc) returns True for the class itself but returns
676 False for all its direct base classes. Implicit ABCs for a given class
677 (either registered or inferred from the presence of a special method like
678 __len__) are inserted directly after the last ABC explicitly listed in the
679 MRO of said class. If two implicit ABCs end up next to each other in the
680 resulting MRO, their ordering depends on the order of types in *abcs*.
681
682 """
683 for i, base in enumerate(reversed(cls.__bases__)):
684 if hasattr(base, '__abstractmethods__'):
685 boundary = len(cls.__bases__) - i
686 break # Bases up to the last explicit ABC are considered first.
687 else:
688 boundary = 0
689 abcs = list(abcs) if abcs else []
690 explicit_bases = list(cls.__bases__[:boundary])
691 abstract_bases = []
692 other_bases = list(cls.__bases__[boundary:])
693 for base in abcs:
694 if issubclass(cls, base) and not any(
695 issubclass(b, base) for b in cls.__bases__
696 ):
697 # If *cls* is the class that introduces behaviour described by
698 # an ABC *base*, insert said ABC to its MRO.
699 abstract_bases.append(base)
700 for base in abstract_bases:
701 abcs.remove(base)
702 explicit_c3_mros = [_c3_mro(base, abcs=abcs) for base in explicit_bases]
703 abstract_c3_mros = [_c3_mro(base, abcs=abcs) for base in abstract_bases]
704 other_c3_mros = [_c3_mro(base, abcs=abcs) for base in other_bases]
705 return _c3_merge(
706 [[cls]] +
707 explicit_c3_mros + abstract_c3_mros + other_c3_mros +
708 [explicit_bases] + [abstract_bases] + [other_bases]
709 )
710
711def _compose_mro(cls, types):
712 """Calculates the method resolution order for a given class *cls*.
713
714 Includes relevant abstract base classes (with their respective bases) from
715 the *types* iterable. Uses a modified C3 linearization algorithm.
Łukasz Langa6f692512013-06-05 12:20:24 +0200716
717 """
718 bases = set(cls.__mro__)
Łukasz Langa3720c772013-07-01 16:00:38 +0200719 # Remove entries which are already present in the __mro__ or unrelated.
720 def is_related(typ):
721 return (typ not in bases and hasattr(typ, '__mro__')
722 and issubclass(cls, typ))
723 types = [n for n in types if is_related(n)]
724 # Remove entries which are strict bases of other entries (they will end up
725 # in the MRO anyway.
726 def is_strict_base(typ):
727 for other in types:
728 if typ != other and typ in other.__mro__:
729 return True
730 return False
731 types = [n for n in types if not is_strict_base(n)]
732 # Subclasses of the ABCs in *types* which are also implemented by
733 # *cls* can be used to stabilize ABC ordering.
734 type_set = set(types)
735 mro = []
736 for typ in types:
737 found = []
738 for sub in typ.__subclasses__():
739 if sub not in bases and issubclass(cls, sub):
740 found.append([s for s in sub.__mro__ if s in type_set])
741 if not found:
742 mro.append(typ)
743 continue
744 # Favor subclasses with the biggest number of useful bases
745 found.sort(key=len, reverse=True)
746 for sub in found:
747 for subcls in sub:
748 if subcls not in mro:
749 mro.append(subcls)
750 return _c3_mro(cls, abcs=mro)
Łukasz Langa6f692512013-06-05 12:20:24 +0200751
752def _find_impl(cls, registry):
Łukasz Langa3720c772013-07-01 16:00:38 +0200753 """Returns the best matching implementation from *registry* for type *cls*.
Łukasz Langa6f692512013-06-05 12:20:24 +0200754
Łukasz Langa3720c772013-07-01 16:00:38 +0200755 Where there is no registered implementation for a specific type, its method
756 resolution order is used to find a more generic implementation.
757
758 Note: if *registry* does not contain an implementation for the base
759 *object* type, this function may return None.
Łukasz Langa6f692512013-06-05 12:20:24 +0200760
761 """
762 mro = _compose_mro(cls, registry.keys())
763 match = None
764 for t in mro:
765 if match is not None:
Łukasz Langa3720c772013-07-01 16:00:38 +0200766 # If *match* is an implicit ABC but there is another unrelated,
767 # equally matching implicit ABC, refuse the temptation to guess.
768 if (t in registry and t not in cls.__mro__
769 and match not in cls.__mro__
770 and not issubclass(match, t)):
Łukasz Langa6f692512013-06-05 12:20:24 +0200771 raise RuntimeError("Ambiguous dispatch: {} or {}".format(
772 match, t))
773 break
774 if t in registry:
775 match = t
776 return registry.get(match)
777
778def singledispatch(func):
779 """Single-dispatch generic function decorator.
780
781 Transforms a function into a generic function, which can have different
782 behaviours depending upon the type of its first argument. The decorated
783 function acts as the default implementation, and additional
Łukasz Langa3720c772013-07-01 16:00:38 +0200784 implementations can be registered using the register() attribute of the
785 generic function.
Łukasz Langa6f692512013-06-05 12:20:24 +0200786 """
INADA Naoki9811e802017-09-30 16:13:02 +0900787 # There are many programs that use functools without singledispatch, so we
788 # trade-off making singledispatch marginally slower for the benefit of
789 # making start-up of such applications slightly faster.
790 import types, weakref
791
Łukasz Langa6f692512013-06-05 12:20:24 +0200792 registry = {}
INADA Naoki9811e802017-09-30 16:13:02 +0900793 dispatch_cache = weakref.WeakKeyDictionary()
Łukasz Langa6f692512013-06-05 12:20:24 +0200794 cache_token = None
795
Łukasz Langa3720c772013-07-01 16:00:38 +0200796 def dispatch(cls):
797 """generic_func.dispatch(cls) -> <function implementation>
Łukasz Langa6f692512013-06-05 12:20:24 +0200798
799 Runs the dispatch algorithm to return the best available implementation
Łukasz Langa3720c772013-07-01 16:00:38 +0200800 for the given *cls* registered on *generic_func*.
Łukasz Langa6f692512013-06-05 12:20:24 +0200801
802 """
803 nonlocal cache_token
804 if cache_token is not None:
805 current_token = get_cache_token()
806 if cache_token != current_token:
807 dispatch_cache.clear()
808 cache_token = current_token
809 try:
Łukasz Langa3720c772013-07-01 16:00:38 +0200810 impl = dispatch_cache[cls]
Łukasz Langa6f692512013-06-05 12:20:24 +0200811 except KeyError:
812 try:
Łukasz Langa3720c772013-07-01 16:00:38 +0200813 impl = registry[cls]
Łukasz Langa6f692512013-06-05 12:20:24 +0200814 except KeyError:
Łukasz Langa3720c772013-07-01 16:00:38 +0200815 impl = _find_impl(cls, registry)
816 dispatch_cache[cls] = impl
Łukasz Langa6f692512013-06-05 12:20:24 +0200817 return impl
818
Łukasz Langa3720c772013-07-01 16:00:38 +0200819 def register(cls, func=None):
820 """generic_func.register(cls, func) -> func
Łukasz Langa6f692512013-06-05 12:20:24 +0200821
Łukasz Langa3720c772013-07-01 16:00:38 +0200822 Registers a new implementation for the given *cls* on a *generic_func*.
Łukasz Langa6f692512013-06-05 12:20:24 +0200823
824 """
825 nonlocal cache_token
826 if func is None:
Łukasz Langae5697532017-12-11 13:56:31 -0800827 if isinstance(cls, type):
828 return lambda f: register(cls, f)
829 ann = getattr(cls, '__annotations__', {})
830 if not ann:
831 raise TypeError(
832 f"Invalid first argument to `register()`: {cls!r}. "
833 f"Use either `@register(some_class)` or plain `@register` "
834 f"on an annotated function."
835 )
836 func = cls
837
838 # only import typing if annotation parsing is necessary
839 from typing import get_type_hints
840 argname, cls = next(iter(get_type_hints(func).items()))
Lysandros Nikolaoud6738102019-05-20 00:11:21 +0200841 if not isinstance(cls, type):
842 raise TypeError(
843 f"Invalid annotation for {argname!r}. "
844 f"{cls!r} is not a class."
845 )
Łukasz Langa3720c772013-07-01 16:00:38 +0200846 registry[cls] = func
847 if cache_token is None and hasattr(cls, '__abstractmethods__'):
Łukasz Langa6f692512013-06-05 12:20:24 +0200848 cache_token = get_cache_token()
849 dispatch_cache.clear()
850 return func
851
852 def wrapper(*args, **kw):
Dong-hee Na445f1b32018-07-10 16:26:36 +0900853 if not args:
854 raise TypeError(f'{funcname} requires at least '
855 '1 positional argument')
856
Łukasz Langa6f692512013-06-05 12:20:24 +0200857 return dispatch(args[0].__class__)(*args, **kw)
858
Dong-hee Na445f1b32018-07-10 16:26:36 +0900859 funcname = getattr(func, '__name__', 'singledispatch function')
Łukasz Langa6f692512013-06-05 12:20:24 +0200860 registry[object] = func
861 wrapper.register = register
862 wrapper.dispatch = dispatch
INADA Naoki9811e802017-09-30 16:13:02 +0900863 wrapper.registry = types.MappingProxyType(registry)
Łukasz Langa6f692512013-06-05 12:20:24 +0200864 wrapper._clear_cache = dispatch_cache.clear
865 update_wrapper(wrapper, func)
866 return wrapper
Ethan Smithc6512752018-05-26 16:38:33 -0400867
868
869# Descriptor version
870class singledispatchmethod:
871 """Single-dispatch generic method descriptor.
872
873 Supports wrapping existing descriptors and handles non-descriptor
874 callables as instance methods.
875 """
876
877 def __init__(self, func):
878 if not callable(func) and not hasattr(func, "__get__"):
879 raise TypeError(f"{func!r} is not callable or a descriptor")
880
881 self.dispatcher = singledispatch(func)
882 self.func = func
883
884 def register(self, cls, method=None):
885 """generic_method.register(cls, func) -> func
886
887 Registers a new implementation for the given *cls* on a *generic_method*.
888 """
889 return self.dispatcher.register(cls, func=method)
890
891 def __get__(self, obj, cls):
892 def _method(*args, **kwargs):
893 method = self.dispatcher.dispatch(args[0].__class__)
894 return method.__get__(obj, cls)(*args, **kwargs)
895
896 _method.__isabstractmethod__ = self.__isabstractmethod__
897 _method.register = self.register
898 update_wrapper(_method, self.func)
899 return _method
900
901 @property
902 def __isabstractmethod__(self):
903 return getattr(self.func, '__isabstractmethod__', False)
Carl Meyerd658dea2018-08-28 01:11:56 -0600904
905
906################################################################################
907### cached_property() - computed once per instance, cached as attribute
908################################################################################
909
910_NOT_FOUND = object()
911
912
913class cached_property:
914 def __init__(self, func):
915 self.func = func
916 self.attrname = None
917 self.__doc__ = func.__doc__
918 self.lock = RLock()
919
920 def __set_name__(self, owner, name):
921 if self.attrname is None:
922 self.attrname = name
923 elif name != self.attrname:
924 raise TypeError(
925 "Cannot assign the same cached_property to two different names "
926 f"({self.attrname!r} and {name!r})."
927 )
928
929 def __get__(self, instance, owner):
930 if instance is None:
931 return self
932 if self.attrname is None:
933 raise TypeError(
934 "Cannot use cached_property instance without calling __set_name__ on it.")
935 try:
936 cache = instance.__dict__
937 except AttributeError: # not all objects have __dict__ (e.g. class defines slots)
938 msg = (
939 f"No '__dict__' attribute on {type(instance).__name__!r} "
940 f"instance to cache {self.attrname!r} property."
941 )
942 raise TypeError(msg) from None
943 val = cache.get(self.attrname, _NOT_FOUND)
944 if val is _NOT_FOUND:
945 with self.lock:
946 # check if another thread filled cache while we awaited lock
947 val = cache.get(self.attrname, _NOT_FOUND)
948 if val is _NOT_FOUND:
949 val = self.func(instance)
950 try:
951 cache[self.attrname] = val
952 except TypeError:
953 msg = (
954 f"The '__dict__' attribute on {type(instance).__name__!r} instance "
955 f"does not support item assignment for caching {self.attrname!r} property."
956 )
957 raise TypeError(msg) from None
958 return val