blob: 426653f13f6d1e2e354ea49fee00362175f2987b [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
276 def __new__(*args, **keywords):
277 if not args:
278 raise TypeError("descriptor '__new__' of partial needs an argument")
279 if len(args) < 2:
280 raise TypeError("type 'partial' takes at least one argument")
281 cls, func, *args = args
282 if not callable(func):
283 raise TypeError("the first argument must be callable")
284 args = tuple(args)
285
286 if hasattr(func, "func"):
287 args = func.args + args
Serhiy Storchakada084702019-03-27 08:02:28 +0200288 keywords = {**func.keywords, **keywords}
Nick Coghlan457fc9a2016-09-10 20:00:02 +1000289 func = func.func
290
291 self = super(partial, cls).__new__(cls)
292
293 self.func = func
294 self.args = args
295 self.keywords = keywords
296 return self
297
298 def __call__(*args, **keywords):
299 if not args:
300 raise TypeError("descriptor '__call__' of partial needs an argument")
301 self, *args = args
Serhiy Storchakada084702019-03-27 08:02:28 +0200302 keywords = {**self.keywords, **keywords}
303 return self.func(*self.args, *args, **keywords)
Nick Coghlan457fc9a2016-09-10 20:00:02 +1000304
305 @recursive_repr()
306 def __repr__(self):
307 qualname = type(self).__qualname__
308 args = [repr(self.func)]
309 args.extend(repr(x) for x in self.args)
310 args.extend(f"{k}={v!r}" for (k, v) in self.keywords.items())
311 if type(self).__module__ == "functools":
312 return f"functools.{qualname}({', '.join(args)})"
313 return f"{qualname}({', '.join(args)})"
314
315 def __reduce__(self):
316 return type(self), (self.func,), (self.func, self.args,
317 self.keywords or None, self.__dict__ or None)
318
319 def __setstate__(self, state):
320 if not isinstance(state, tuple):
321 raise TypeError("argument to __setstate__ must be a tuple")
322 if len(state) != 4:
323 raise TypeError(f"expected 4 items in state, got {len(state)}")
324 func, args, kwds, namespace = state
325 if (not callable(func) or not isinstance(args, tuple) or
326 (kwds is not None and not isinstance(kwds, dict)) or
327 (namespace is not None and not isinstance(namespace, dict))):
328 raise TypeError("invalid partial state")
329
330 args = tuple(args) # just in case it's a subclass
331 if kwds is None:
332 kwds = {}
333 elif type(kwds) is not dict: # XXX does it need to be *exactly* dict?
334 kwds = dict(kwds)
335 if namespace is None:
336 namespace = {}
337
338 self.__dict__ = namespace
339 self.func = func
340 self.args = args
341 self.keywords = kwds
Antoine Pitroub5b37142012-11-13 21:35:40 +0100342
343try:
344 from _functools import partial
Brett Cannoncd171c82013-07-04 17:43:24 -0400345except ImportError:
Antoine Pitroub5b37142012-11-13 21:35:40 +0100346 pass
347
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000348# Descriptor version
349class partialmethod(object):
350 """Method descriptor with partial application of the given arguments
351 and keywords.
352
353 Supports wrapping existing descriptors and handles non-descriptor
354 callables as instance methods.
355 """
356
357 def __init__(self, func, *args, **keywords):
358 if not callable(func) and not hasattr(func, "__get__"):
359 raise TypeError("{!r} is not callable or a descriptor"
360 .format(func))
361
362 # func could be a descriptor like classmethod which isn't callable,
363 # so we can't inherit from partial (it verifies func is callable)
364 if isinstance(func, partialmethod):
365 # flattening is mandatory in order to place cls/self before all
366 # other arguments
367 # it's also more efficient since only one function will be called
368 self.func = func.func
369 self.args = func.args + args
Serhiy Storchakada084702019-03-27 08:02:28 +0200370 self.keywords = {**func.keywords, **keywords}
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000371 else:
372 self.func = func
373 self.args = args
374 self.keywords = keywords
375
376 def __repr__(self):
377 args = ", ".join(map(repr, self.args))
378 keywords = ", ".join("{}={!r}".format(k, v)
379 for k, v in self.keywords.items())
380 format_string = "{module}.{cls}({func}, {args}, {keywords})"
381 return format_string.format(module=self.__class__.__module__,
Serhiy Storchaka521e5862014-07-22 15:00:37 +0300382 cls=self.__class__.__qualname__,
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000383 func=self.func,
384 args=args,
385 keywords=keywords)
386
387 def _make_unbound_method(self):
388 def _method(*args, **keywords):
Serhiy Storchakada084702019-03-27 08:02:28 +0200389 cls_or_self, *args = args
390 keywords = {**self.keywords, **keywords}
391 return self.func(cls_or_self, *self.args, *args, **keywords)
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000392 _method.__isabstractmethod__ = self.__isabstractmethod__
Yury Selivanovda5fe4f2014-01-27 17:28:37 -0500393 _method._partialmethod = self
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000394 return _method
395
396 def __get__(self, obj, cls):
397 get = getattr(self.func, "__get__", None)
398 result = None
399 if get is not None:
400 new_func = get(obj, cls)
401 if new_func is not self.func:
402 # Assume __get__ returning something new indicates the
403 # creation of an appropriate callable
404 result = partial(new_func, *self.args, **self.keywords)
405 try:
406 result.__self__ = new_func.__self__
407 except AttributeError:
408 pass
409 if result is None:
410 # If the underlying descriptor didn't do anything, treat this
411 # like an instance method
412 result = self._make_unbound_method().__get__(obj, cls)
413 return result
414
415 @property
416 def __isabstractmethod__(self):
417 return getattr(self.func, "__isabstractmethod__", False)
418
Pablo Galindo7cd25432018-10-26 12:19:14 +0100419# Helper functions
420
421def _unwrap_partial(func):
422 while isinstance(func, partial):
423 func = func.func
424 return func
Antoine Pitroub5b37142012-11-13 21:35:40 +0100425
426################################################################################
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700427### LRU Cache function decorator
428################################################################################
429
Raymond Hettingerdce583e2012-03-16 22:12:20 -0700430_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])
Nick Coghlan234515a2010-11-30 06:19:46 +0000431
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700432class _HashedSeq(list):
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700433 """ This class guarantees that hash() will be called no more than once
434 per element. This is important because the lru_cache() will hash
435 the key multiple times on a cache miss.
436
437 """
438
Raymond Hettinger9acbb602012-04-30 22:32:16 -0700439 __slots__ = 'hashvalue'
440
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700441 def __init__(self, tup, hash=hash):
442 self[:] = tup
443 self.hashvalue = hash(tup)
Raymond Hettinger9acbb602012-04-30 22:32:16 -0700444
445 def __hash__(self):
446 return self.hashvalue
447
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700448def _make_key(args, kwds, typed,
449 kwd_mark = (object(),),
Raymond Hettingerd8080c02019-01-26 03:02:00 -0500450 fasttypes = {int, str},
Raymond Hettinger4ee39142017-01-08 17:28:20 -0800451 tuple=tuple, type=type, len=len):
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700452 """Make a cache key from optionally typed positional and keyword arguments
453
454 The key is constructed in a way that is flat as possible rather than
455 as a nested structure that would take more memory.
456
457 If there is only a single argument and its data type is known to cache
458 its hash value, then that argument is returned without a wrapper. This
459 saves space and improves lookup speed.
460
461 """
Raymond Hettinger55037092017-09-04 17:47:53 -0700462 # All of code below relies on kwds preserving the order input by the user.
463 # Formerly, we sorted() the kwds before looping. The new way is *much*
464 # faster; however, it means that f(x=1, y=2) will now be treated as a
465 # distinct call from f(y=2, x=1) which will be cached separately.
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700466 key = args
467 if kwds:
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700468 key += kwd_mark
Raymond Hettinger4ee39142017-01-08 17:28:20 -0800469 for item in kwds.items():
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700470 key += item
471 if typed:
472 key += tuple(type(v) for v in args)
473 if kwds:
Raymond Hettinger4ee39142017-01-08 17:28:20 -0800474 key += tuple(type(v) for v in kwds.values())
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700475 elif len(key) == 1 and type(key[0]) in fasttypes:
476 return key[0]
477 return _HashedSeq(key)
478
Raymond Hettinger010ce322012-05-19 21:20:48 -0700479def lru_cache(maxsize=128, typed=False):
Benjamin Peterson1f594ad2010-08-08 13:17:07 +0000480 """Least-recently-used cache decorator.
Georg Brandl2e7346a2010-07-31 18:09:23 +0000481
Raymond Hettingerc79fb0e2010-12-01 03:45:41 +0000482 If *maxsize* is set to None, the LRU features are disabled and the cache
483 can grow without bound.
484
Raymond Hettingercd9fdfd2011-10-20 08:57:45 -0700485 If *typed* is True, arguments of different types will be cached separately.
486 For example, f(3.0) and f(3) will be treated as distinct calls with
487 distinct results.
488
Georg Brandl2e7346a2010-07-31 18:09:23 +0000489 Arguments to the cached function must be hashable.
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000490
Raymond Hettinger7f7a5a72012-03-30 21:50:40 -0700491 View the cache statistics named tuple (hits, misses, maxsize, currsize)
492 with f.cache_info(). Clear the cache and statistics with f.cache_clear().
Raymond Hettinger00f2f972010-12-01 00:47:56 +0000493 Access the underlying function with f.__wrapped__.
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000494
495 See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used
Georg Brandl2e7346a2010-07-31 18:09:23 +0000496
Benjamin Peterson1f594ad2010-08-08 13:17:07 +0000497 """
Raymond Hettinger1ff50df2012-03-30 13:15:48 -0700498
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000499 # Users should only access the lru_cache through its public API:
Raymond Hettinger5e20bab2010-11-30 07:13:04 +0000500 # cache_info, cache_clear, and f.__wrapped__
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000501 # The internals of the lru_cache are encapsulated for thread safety and
502 # to allow the implementation to change (including a possible C version).
503
Raymond Hettinger4d588972014-08-12 12:44:52 -0700504 # Early detection of an erroneous call to @lru_cache without any arguments
505 # resulting in the inner function being passed to maxsize instead of an
Raymond Hettingerd8080c02019-01-26 03:02:00 -0500506 # integer or None. Negative maxsize is treated as 0.
507 if isinstance(maxsize, int):
508 if maxsize < 0:
509 maxsize = 0
510 elif maxsize is not None:
Raymond Hettinger4d588972014-08-12 12:44:52 -0700511 raise TypeError('Expected maxsize to be an integer or None')
512
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300513 def decorating_function(user_function):
514 wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo)
515 return update_wrapper(wrapper, user_function)
516
517 return decorating_function
518
519def _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo):
Raymond Hettinger9f0ab9f2012-04-29 14:55:27 -0700520 # Constants shared by all lru cache instances:
Raymond Hettingerb6b98c02012-04-29 18:09:02 -0700521 sentinel = object() # unique object used to signal cache misses
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700522 make_key = _make_key # build a key from the function arguments
Raymond Hettinger9f0ab9f2012-04-29 14:55:27 -0700523 PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields
524
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300525 cache = {}
526 hits = misses = 0
527 full = False
528 cache_get = cache.get # bound method to lookup a key or return None
Raymond Hettingerb2d4b3d2016-12-16 14:59:37 -0800529 cache_len = cache.__len__ # get cache size without calling len()
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300530 lock = RLock() # because linkedlist updates aren't threadsafe
531 root = [] # root of the circular doubly linked list
532 root[:] = [root, root, None, None] # initialize by pointing to self
Raymond Hettinger6e8c8172012-03-16 16:53:05 -0700533
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300534 if maxsize == 0:
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700535
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300536 def wrapper(*args, **kwds):
Raymond Hettingerffdf1c32019-01-31 15:03:38 -0800537 # No caching -- just a statistics update
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300538 nonlocal misses
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300539 misses += 1
Raymond Hettingerffdf1c32019-01-31 15:03:38 -0800540 result = user_function(*args, **kwds)
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300541 return result
542
543 elif maxsize is None:
544
545 def wrapper(*args, **kwds):
546 # Simple caching without ordering or size limit
547 nonlocal hits, misses
548 key = make_key(args, kwds, typed)
549 result = cache_get(key, sentinel)
550 if result is not sentinel:
551 hits += 1
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700552 return result
Raymond Hettingerffdf1c32019-01-31 15:03:38 -0800553 misses += 1
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300554 result = user_function(*args, **kwds)
555 cache[key] = result
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300556 return result
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700557
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300558 else:
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700559
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300560 def wrapper(*args, **kwds):
561 # Size limited caching that tracks accesses by recency
562 nonlocal root, hits, misses, full
563 key = make_key(args, kwds, typed)
564 with lock:
565 link = cache_get(key)
566 if link is not None:
567 # Move the link to the front of the circular queue
568 link_prev, link_next, _key, result = link
569 link_prev[NEXT] = link_next
570 link_next[PREV] = link_prev
571 last = root[PREV]
572 last[NEXT] = root[PREV] = link
573 link[PREV] = last
574 link[NEXT] = root
Nick Coghlan234515a2010-11-30 06:19:46 +0000575 hits += 1
Raymond Hettinger4b779b32011-10-15 23:50:42 -0700576 return result
Raymond Hettingerd8080c02019-01-26 03:02:00 -0500577 misses += 1
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300578 result = user_function(*args, **kwds)
579 with lock:
580 if key in cache:
581 # Getting here means that this same key was added to the
582 # cache while the lock was released. Since the link
583 # update is already done, we need only return the
584 # computed result and update the count of misses.
585 pass
586 elif full:
587 # Use the old root to store the new key and result.
588 oldroot = root
589 oldroot[KEY] = key
590 oldroot[RESULT] = result
591 # Empty the oldest link and make it the new root.
592 # Keep a reference to the old key and old result to
593 # prevent their ref counts from going to zero during the
594 # update. That will prevent potentially arbitrary object
595 # clean-up code (i.e. __del__) from running while we're
596 # still adjusting the links.
597 root = oldroot[NEXT]
598 oldkey = root[KEY]
599 oldresult = root[RESULT]
600 root[KEY] = root[RESULT] = None
601 # Now update the cache dictionary.
602 del cache[oldkey]
603 # Save the potentially reentrant cache[key] assignment
604 # for last, after the root and links have been put in
605 # a consistent state.
606 cache[key] = oldroot
607 else:
608 # Put result in a new link at the front of the queue.
609 last = root[PREV]
610 link = [last, root, key, result]
611 last[NEXT] = root[PREV] = cache[key] = link
Raymond Hettingerb2d4b3d2016-12-16 14:59:37 -0800612 # Use the cache_len bound method instead of the len() function
Raymond Hettingeraf56e0e2016-12-16 13:57:40 -0800613 # which could potentially be wrapped in an lru_cache itself.
Raymond Hettingerb2d4b3d2016-12-16 14:59:37 -0800614 full = (cache_len() >= maxsize)
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300615 return result
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700616
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300617 def cache_info():
618 """Report cache statistics"""
619 with lock:
Raymond Hettingerb2d4b3d2016-12-16 14:59:37 -0800620 return _CacheInfo(hits, misses, maxsize, cache_len())
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700621
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300622 def cache_clear():
623 """Clear the cache and cache statistics"""
624 nonlocal hits, misses, full
625 with lock:
626 cache.clear()
627 root[:] = [root, root, None, None]
628 hits = misses = 0
629 full = False
Georg Brandl2e7346a2010-07-31 18:09:23 +0000630
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300631 wrapper.cache_info = cache_info
632 wrapper.cache_clear = cache_clear
Serhiy Storchakace2295d2015-10-24 09:51:53 +0300633 return wrapper
Nick Coghlan234515a2010-11-30 06:19:46 +0000634
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300635try:
636 from _functools import _lru_cache_wrapper
637except ImportError:
638 pass
Łukasz Langa6f692512013-06-05 12:20:24 +0200639
640
641################################################################################
642### singledispatch() - single-dispatch generic function decorator
643################################################################################
644
Łukasz Langa3720c772013-07-01 16:00:38 +0200645def _c3_merge(sequences):
646 """Merges MROs in *sequences* to a single MRO using the C3 algorithm.
647
648 Adapted from http://www.python.org/download/releases/2.3/mro/.
649
650 """
651 result = []
652 while True:
653 sequences = [s for s in sequences if s] # purge empty sequences
654 if not sequences:
655 return result
656 for s1 in sequences: # find merge candidates among seq heads
657 candidate = s1[0]
658 for s2 in sequences:
659 if candidate in s2[1:]:
660 candidate = None
661 break # reject the current head, it appears later
662 else:
663 break
Yury Selivanov77a8cd62015-08-18 14:20:00 -0400664 if candidate is None:
Łukasz Langa3720c772013-07-01 16:00:38 +0200665 raise RuntimeError("Inconsistent hierarchy")
666 result.append(candidate)
667 # remove the chosen candidate
668 for seq in sequences:
669 if seq[0] == candidate:
670 del seq[0]
671
672def _c3_mro(cls, abcs=None):
673 """Computes the method resolution order using extended C3 linearization.
674
675 If no *abcs* are given, the algorithm works exactly like the built-in C3
676 linearization used for method resolution.
677
678 If given, *abcs* is a list of abstract base classes that should be inserted
679 into the resulting MRO. Unrelated ABCs are ignored and don't end up in the
680 result. The algorithm inserts ABCs where their functionality is introduced,
681 i.e. issubclass(cls, abc) returns True for the class itself but returns
682 False for all its direct base classes. Implicit ABCs for a given class
683 (either registered or inferred from the presence of a special method like
684 __len__) are inserted directly after the last ABC explicitly listed in the
685 MRO of said class. If two implicit ABCs end up next to each other in the
686 resulting MRO, their ordering depends on the order of types in *abcs*.
687
688 """
689 for i, base in enumerate(reversed(cls.__bases__)):
690 if hasattr(base, '__abstractmethods__'):
691 boundary = len(cls.__bases__) - i
692 break # Bases up to the last explicit ABC are considered first.
693 else:
694 boundary = 0
695 abcs = list(abcs) if abcs else []
696 explicit_bases = list(cls.__bases__[:boundary])
697 abstract_bases = []
698 other_bases = list(cls.__bases__[boundary:])
699 for base in abcs:
700 if issubclass(cls, base) and not any(
701 issubclass(b, base) for b in cls.__bases__
702 ):
703 # If *cls* is the class that introduces behaviour described by
704 # an ABC *base*, insert said ABC to its MRO.
705 abstract_bases.append(base)
706 for base in abstract_bases:
707 abcs.remove(base)
708 explicit_c3_mros = [_c3_mro(base, abcs=abcs) for base in explicit_bases]
709 abstract_c3_mros = [_c3_mro(base, abcs=abcs) for base in abstract_bases]
710 other_c3_mros = [_c3_mro(base, abcs=abcs) for base in other_bases]
711 return _c3_merge(
712 [[cls]] +
713 explicit_c3_mros + abstract_c3_mros + other_c3_mros +
714 [explicit_bases] + [abstract_bases] + [other_bases]
715 )
716
717def _compose_mro(cls, types):
718 """Calculates the method resolution order for a given class *cls*.
719
720 Includes relevant abstract base classes (with their respective bases) from
721 the *types* iterable. Uses a modified C3 linearization algorithm.
Łukasz Langa6f692512013-06-05 12:20:24 +0200722
723 """
724 bases = set(cls.__mro__)
Łukasz Langa3720c772013-07-01 16:00:38 +0200725 # Remove entries which are already present in the __mro__ or unrelated.
726 def is_related(typ):
727 return (typ not in bases and hasattr(typ, '__mro__')
728 and issubclass(cls, typ))
729 types = [n for n in types if is_related(n)]
730 # Remove entries which are strict bases of other entries (they will end up
731 # in the MRO anyway.
732 def is_strict_base(typ):
733 for other in types:
734 if typ != other and typ in other.__mro__:
735 return True
736 return False
737 types = [n for n in types if not is_strict_base(n)]
738 # Subclasses of the ABCs in *types* which are also implemented by
739 # *cls* can be used to stabilize ABC ordering.
740 type_set = set(types)
741 mro = []
742 for typ in types:
743 found = []
744 for sub in typ.__subclasses__():
745 if sub not in bases and issubclass(cls, sub):
746 found.append([s for s in sub.__mro__ if s in type_set])
747 if not found:
748 mro.append(typ)
749 continue
750 # Favor subclasses with the biggest number of useful bases
751 found.sort(key=len, reverse=True)
752 for sub in found:
753 for subcls in sub:
754 if subcls not in mro:
755 mro.append(subcls)
756 return _c3_mro(cls, abcs=mro)
Łukasz Langa6f692512013-06-05 12:20:24 +0200757
758def _find_impl(cls, registry):
Łukasz Langa3720c772013-07-01 16:00:38 +0200759 """Returns the best matching implementation from *registry* for type *cls*.
Łukasz Langa6f692512013-06-05 12:20:24 +0200760
Łukasz Langa3720c772013-07-01 16:00:38 +0200761 Where there is no registered implementation for a specific type, its method
762 resolution order is used to find a more generic implementation.
763
764 Note: if *registry* does not contain an implementation for the base
765 *object* type, this function may return None.
Łukasz Langa6f692512013-06-05 12:20:24 +0200766
767 """
768 mro = _compose_mro(cls, registry.keys())
769 match = None
770 for t in mro:
771 if match is not None:
Łukasz Langa3720c772013-07-01 16:00:38 +0200772 # If *match* is an implicit ABC but there is another unrelated,
773 # equally matching implicit ABC, refuse the temptation to guess.
774 if (t in registry and t not in cls.__mro__
775 and match not in cls.__mro__
776 and not issubclass(match, t)):
Łukasz Langa6f692512013-06-05 12:20:24 +0200777 raise RuntimeError("Ambiguous dispatch: {} or {}".format(
778 match, t))
779 break
780 if t in registry:
781 match = t
782 return registry.get(match)
783
784def singledispatch(func):
785 """Single-dispatch generic function decorator.
786
787 Transforms a function into a generic function, which can have different
788 behaviours depending upon the type of its first argument. The decorated
789 function acts as the default implementation, and additional
Łukasz Langa3720c772013-07-01 16:00:38 +0200790 implementations can be registered using the register() attribute of the
791 generic function.
Łukasz Langa6f692512013-06-05 12:20:24 +0200792 """
INADA Naoki9811e802017-09-30 16:13:02 +0900793 # There are many programs that use functools without singledispatch, so we
794 # trade-off making singledispatch marginally slower for the benefit of
795 # making start-up of such applications slightly faster.
796 import types, weakref
797
Łukasz Langa6f692512013-06-05 12:20:24 +0200798 registry = {}
INADA Naoki9811e802017-09-30 16:13:02 +0900799 dispatch_cache = weakref.WeakKeyDictionary()
Łukasz Langa6f692512013-06-05 12:20:24 +0200800 cache_token = None
801
Łukasz Langa3720c772013-07-01 16:00:38 +0200802 def dispatch(cls):
803 """generic_func.dispatch(cls) -> <function implementation>
Łukasz Langa6f692512013-06-05 12:20:24 +0200804
805 Runs the dispatch algorithm to return the best available implementation
Łukasz Langa3720c772013-07-01 16:00:38 +0200806 for the given *cls* registered on *generic_func*.
Łukasz Langa6f692512013-06-05 12:20:24 +0200807
808 """
809 nonlocal cache_token
810 if cache_token is not None:
811 current_token = get_cache_token()
812 if cache_token != current_token:
813 dispatch_cache.clear()
814 cache_token = current_token
815 try:
Łukasz Langa3720c772013-07-01 16:00:38 +0200816 impl = dispatch_cache[cls]
Łukasz Langa6f692512013-06-05 12:20:24 +0200817 except KeyError:
818 try:
Łukasz Langa3720c772013-07-01 16:00:38 +0200819 impl = registry[cls]
Łukasz Langa6f692512013-06-05 12:20:24 +0200820 except KeyError:
Łukasz Langa3720c772013-07-01 16:00:38 +0200821 impl = _find_impl(cls, registry)
822 dispatch_cache[cls] = impl
Łukasz Langa6f692512013-06-05 12:20:24 +0200823 return impl
824
Łukasz Langa3720c772013-07-01 16:00:38 +0200825 def register(cls, func=None):
826 """generic_func.register(cls, func) -> func
Łukasz Langa6f692512013-06-05 12:20:24 +0200827
Łukasz Langa3720c772013-07-01 16:00:38 +0200828 Registers a new implementation for the given *cls* on a *generic_func*.
Łukasz Langa6f692512013-06-05 12:20:24 +0200829
830 """
831 nonlocal cache_token
832 if func is None:
Łukasz Langae5697532017-12-11 13:56:31 -0800833 if isinstance(cls, type):
834 return lambda f: register(cls, f)
835 ann = getattr(cls, '__annotations__', {})
836 if not ann:
837 raise TypeError(
838 f"Invalid first argument to `register()`: {cls!r}. "
839 f"Use either `@register(some_class)` or plain `@register` "
840 f"on an annotated function."
841 )
842 func = cls
843
844 # only import typing if annotation parsing is necessary
845 from typing import get_type_hints
846 argname, cls = next(iter(get_type_hints(func).items()))
847 assert isinstance(cls, type), (
848 f"Invalid annotation for {argname!r}. {cls!r} is not a class."
849 )
Łukasz Langa3720c772013-07-01 16:00:38 +0200850 registry[cls] = func
851 if cache_token is None and hasattr(cls, '__abstractmethods__'):
Łukasz Langa6f692512013-06-05 12:20:24 +0200852 cache_token = get_cache_token()
853 dispatch_cache.clear()
854 return func
855
856 def wrapper(*args, **kw):
Dong-hee Na445f1b32018-07-10 16:26:36 +0900857 if not args:
858 raise TypeError(f'{funcname} requires at least '
859 '1 positional argument')
860
Łukasz Langa6f692512013-06-05 12:20:24 +0200861 return dispatch(args[0].__class__)(*args, **kw)
862
Dong-hee Na445f1b32018-07-10 16:26:36 +0900863 funcname = getattr(func, '__name__', 'singledispatch function')
Łukasz Langa6f692512013-06-05 12:20:24 +0200864 registry[object] = func
865 wrapper.register = register
866 wrapper.dispatch = dispatch
INADA Naoki9811e802017-09-30 16:13:02 +0900867 wrapper.registry = types.MappingProxyType(registry)
Łukasz Langa6f692512013-06-05 12:20:24 +0200868 wrapper._clear_cache = dispatch_cache.clear
869 update_wrapper(wrapper, func)
870 return wrapper
Ethan Smithc6512752018-05-26 16:38:33 -0400871
872
873# Descriptor version
874class singledispatchmethod:
875 """Single-dispatch generic method descriptor.
876
877 Supports wrapping existing descriptors and handles non-descriptor
878 callables as instance methods.
879 """
880
881 def __init__(self, func):
882 if not callable(func) and not hasattr(func, "__get__"):
883 raise TypeError(f"{func!r} is not callable or a descriptor")
884
885 self.dispatcher = singledispatch(func)
886 self.func = func
887
888 def register(self, cls, method=None):
889 """generic_method.register(cls, func) -> func
890
891 Registers a new implementation for the given *cls* on a *generic_method*.
892 """
893 return self.dispatcher.register(cls, func=method)
894
895 def __get__(self, obj, cls):
896 def _method(*args, **kwargs):
897 method = self.dispatcher.dispatch(args[0].__class__)
898 return method.__get__(obj, cls)(*args, **kwargs)
899
900 _method.__isabstractmethod__ = self.__isabstractmethod__
901 _method.register = self.register
902 update_wrapper(_method, self.func)
903 return _method
904
905 @property
906 def __isabstractmethod__(self):
907 return getattr(self.func, '__isabstractmethod__', False)
Carl Meyerd658dea2018-08-28 01:11:56 -0600908
909
910################################################################################
911### cached_property() - computed once per instance, cached as attribute
912################################################################################
913
914_NOT_FOUND = object()
915
916
917class cached_property:
918 def __init__(self, func):
919 self.func = func
920 self.attrname = None
921 self.__doc__ = func.__doc__
922 self.lock = RLock()
923
924 def __set_name__(self, owner, name):
925 if self.attrname is None:
926 self.attrname = name
927 elif name != self.attrname:
928 raise TypeError(
929 "Cannot assign the same cached_property to two different names "
930 f"({self.attrname!r} and {name!r})."
931 )
932
933 def __get__(self, instance, owner):
934 if instance is None:
935 return self
936 if self.attrname is None:
937 raise TypeError(
938 "Cannot use cached_property instance without calling __set_name__ on it.")
939 try:
940 cache = instance.__dict__
941 except AttributeError: # not all objects have __dict__ (e.g. class defines slots)
942 msg = (
943 f"No '__dict__' attribute on {type(instance).__name__!r} "
944 f"instance to cache {self.attrname!r} property."
945 )
946 raise TypeError(msg) from None
947 val = cache.get(self.attrname, _NOT_FOUND)
948 if val is _NOT_FOUND:
949 with self.lock:
950 # check if another thread filled cache while we awaited lock
951 val = cache.get(self.attrname, _NOT_FOUND)
952 if val is _NOT_FOUND:
953 val = self.func(instance)
954 try:
955 cache[self.attrname] = val
956 except TypeError:
957 msg = (
958 f"The '__dict__' attribute on {type(instance).__name__!r} instance "
959 f"does not support item assignment for caching {self.attrname!r} property."
960 )
961 raise TypeError(msg) from None
962 return val