blob: f05b106b62c007fb47e4596256663df421724ef5 [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',
Pablo Galindo99e6c262020-01-23 15:29:52 +000013 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce',
14 'TopologicalSorter', 'CycleError',
Hakan Çelik217dce92020-03-02 00:01:34 +030015 'partial', 'partialmethod', 'singledispatch', 'singledispatchmethod',
Nikita Sobolevbd87a7f2020-03-11 03:32:15 +030016 'cached_property']
Georg Brandl2e7346a2010-07-31 18:09:23 +000017
Łukasz Langa6f692512013-06-05 12:20:24 +020018from abc import get_cache_token
Raymond Hettingerec0e9102012-03-16 01:16:31 -070019from collections import namedtuple
INADA Naoki9811e802017-09-30 16:13:02 +090020# import types, weakref # Deferred to single_dispatch()
Nick Coghlan457fc9a2016-09-10 20:00:02 +100021from reprlib import recursive_repr
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020022from _thread import RLock
Ethan Smithcecf0492020-04-13 21:53:04 -070023from types import GenericAlias
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000024
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -070025
26################################################################################
27### update_wrapper() and wraps() decorator
28################################################################################
29
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000030# update_wrapper() and wraps() are tools to help write
31# wrapper functions that can handle naive introspection
32
Meador Ingeff7f64c2011-12-11 22:37:31 -060033WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__qualname__', '__doc__',
34 '__annotations__')
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000035WRAPPER_UPDATES = ('__dict__',)
36def update_wrapper(wrapper,
37 wrapped,
38 assigned = WRAPPER_ASSIGNMENTS,
39 updated = WRAPPER_UPDATES):
40 """Update a wrapper function to look like the wrapped function
41
42 wrapper is the function to be updated
43 wrapped is the original function
44 assigned is a tuple naming the attributes assigned directly
45 from the wrapped function to the wrapper function (defaults to
46 functools.WRAPPER_ASSIGNMENTS)
Thomas Wouters89f507f2006-12-13 04:49:30 +000047 updated is a tuple naming the attributes of the wrapper that
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000048 are updated with the corresponding attribute from the wrapped
49 function (defaults to functools.WRAPPER_UPDATES)
50 """
51 for attr in assigned:
Nick Coghlan98876832010-08-17 06:17:18 +000052 try:
53 value = getattr(wrapped, attr)
54 except AttributeError:
55 pass
56 else:
57 setattr(wrapper, attr, value)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000058 for attr in updated:
Thomas Wouters89f507f2006-12-13 04:49:30 +000059 getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
Nick Coghlan24c05bc2013-07-15 21:13:08 +100060 # Issue #17482: set __wrapped__ last so we don't inadvertently copy it
61 # from the wrapped function when updating __dict__
62 wrapper.__wrapped__ = wrapped
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000063 # Return the wrapper so this can be used as a decorator via partial()
64 return wrapper
65
66def wraps(wrapped,
67 assigned = WRAPPER_ASSIGNMENTS,
68 updated = WRAPPER_UPDATES):
69 """Decorator factory to apply update_wrapper() to a wrapper function
70
71 Returns a decorator that invokes update_wrapper() with the decorated
72 function as the wrapper argument and the arguments to wraps() as the
73 remaining arguments. Default arguments are as for update_wrapper().
74 This is a convenience function to simplify applying partial() to
75 update_wrapper().
76 """
77 return partial(update_wrapper, wrapped=wrapped,
78 assigned=assigned, updated=updated)
Raymond Hettingerc50846a2010-04-05 18:56:31 +000079
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -070080
81################################################################################
82### total_ordering class decorator
83################################################################################
84
Raymond Hettinger0603d302015-01-05 21:52:10 -080085# The total ordering functions all invoke the root magic method directly
86# rather than using the corresponding operator. This avoids possible
87# infinite recursion that could occur when the operator dispatch logic
88# detects a NotImplemented result and then calls a reflected method.
Nick Coghlanf05d9812013-10-02 00:02:03 +100089
Raymond Hettingerffcd8492015-05-12 21:26:37 -070090def _gt_from_lt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -080091 'Return a > b. Computed by @total_ordering from (not a < b) and (a != b).'
92 op_result = self.__lt__(other)
Nick Coghlanf05d9812013-10-02 00:02:03 +100093 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -080094 return op_result
Nick Coghlanf05d9812013-10-02 00:02:03 +100095 return not op_result and self != other
96
Raymond Hettingerffcd8492015-05-12 21:26:37 -070097def _le_from_lt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -080098 'Return a <= b. Computed by @total_ordering from (a < b) or (a == b).'
99 op_result = self.__lt__(other)
MojoVampire469325c2020-03-03 18:50:17 +0000100 if op_result is NotImplemented:
101 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800102 return op_result or self == other
103
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700104def _ge_from_lt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800105 'Return a >= b. Computed by @total_ordering from (not a < b).'
106 op_result = self.__lt__(other)
107 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800108 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800109 return not op_result
110
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700111def _ge_from_le(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800112 'Return a >= b. Computed by @total_ordering from (not a <= b) or (a == b).'
113 op_result = self.__le__(other)
Nick Coghlanf05d9812013-10-02 00:02:03 +1000114 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800115 return op_result
Nick Coghlanf05d9812013-10-02 00:02:03 +1000116 return not op_result or self == other
117
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700118def _lt_from_le(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800119 'Return a < b. Computed by @total_ordering from (a <= b) and (a != b).'
120 op_result = self.__le__(other)
Nick Coghlanf05d9812013-10-02 00:02:03 +1000121 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800122 return op_result
Nick Coghlanf05d9812013-10-02 00:02:03 +1000123 return op_result and self != other
124
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700125def _gt_from_le(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800126 'Return a > b. Computed by @total_ordering from (not a <= b).'
127 op_result = self.__le__(other)
128 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800129 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800130 return not op_result
131
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700132def _lt_from_gt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800133 'Return a < b. Computed by @total_ordering from (not a > b) and (a != b).'
134 op_result = self.__gt__(other)
135 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800136 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800137 return not op_result and self != other
138
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700139def _ge_from_gt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800140 'Return a >= b. Computed by @total_ordering from (a > b) or (a == b).'
141 op_result = self.__gt__(other)
MojoVampire469325c2020-03-03 18:50:17 +0000142 if op_result is NotImplemented:
143 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800144 return op_result or self == other
145
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700146def _le_from_gt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800147 'Return a <= b. Computed by @total_ordering from (not a > b).'
148 op_result = self.__gt__(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
152
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700153def _le_from_ge(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800154 'Return a <= b. Computed by @total_ordering from (not a >= b) or (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 not op_result or self == other
159
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700160def _gt_from_ge(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800161 'Return a > b. Computed by @total_ordering from (a >= b) and (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 op_result and self != other
166
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700167def _lt_from_ge(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800168 'Return a < b. Computed by @total_ordering from (not a >= b).'
169 op_result = self.__ge__(other)
170 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800171 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800172 return not op_result
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000173
Raymond Hettinger1a8ada82015-01-13 22:57:35 -0800174_convert = {
175 '__lt__': [('__gt__', _gt_from_lt),
176 ('__le__', _le_from_lt),
177 ('__ge__', _ge_from_lt)],
178 '__le__': [('__ge__', _ge_from_le),
179 ('__lt__', _lt_from_le),
180 ('__gt__', _gt_from_le)],
181 '__gt__': [('__lt__', _lt_from_gt),
182 ('__ge__', _ge_from_gt),
183 ('__le__', _le_from_gt)],
184 '__ge__': [('__le__', _le_from_ge),
185 ('__gt__', _gt_from_ge),
186 ('__lt__', _lt_from_ge)]
187}
188
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000189def total_ordering(cls):
Georg Brandle5a26732010-05-19 21:06:36 +0000190 """Class decorator that fills in missing ordering methods"""
Raymond Hettinger3255c632010-09-16 00:31:21 +0000191 # Find user-defined comparisons (not those inherited from object).
Raymond Hettinger15ce0be2017-09-05 09:40:44 -0700192 roots = {op for op in _convert if getattr(cls, op, None) is not getattr(object, op, None)}
Raymond Hettinger56de7e22010-04-10 16:59:03 +0000193 if not roots:
194 raise ValueError('must define at least one ordering operation: < > <= >=')
195 root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__
Raymond Hettinger1a8ada82015-01-13 22:57:35 -0800196 for opname, opfunc in _convert[root]:
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000197 if opname not in roots:
198 opfunc.__name__ = opname
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000199 setattr(cls, opname, opfunc)
200 return cls
201
Pablo Galindo99e6c262020-01-23 15:29:52 +0000202################################################################################
203### topological sort
204################################################################################
205
206_NODE_OUT = -1
207_NODE_DONE = -2
208
209
210class _NodeInfo:
211 __slots__ = 'node', 'npredecessors', 'successors'
212
213 def __init__(self, node):
214 # The node this class is augmenting.
215 self.node = node
216
217 # Number of predecessors, generally >= 0. When this value falls to 0,
218 # and is returned by get_ready(), this is set to _NODE_OUT and when the
219 # node is marked done by a call to done(), set to _NODE_DONE.
220 self.npredecessors = 0
221
222 # List of successor nodes. The list can contain duplicated elements as
223 # long as they're all reflected in the successor's npredecessors attribute).
224 self.successors = []
225
226
227class CycleError(ValueError):
228 """Subclass of ValueError raised by TopologicalSorterif cycles exist in the graph
229
230 If multiple cycles exist, only one undefined choice among them will be reported
231 and included in the exception. The detected cycle can be accessed via the second
232 element in the *args* attribute of the exception instance and consists in a list
233 of nodes, such that each node is, in the graph, an immediate predecessor of the
234 next node in the list. In the reported list, the first and the last node will be
235 the same, to make it clear that it is cyclic.
236 """
237 pass
238
239
240class TopologicalSorter:
241 """Provides functionality to topologically sort a graph of hashable nodes"""
242
243 def __init__(self, graph=None):
244 self._node2info = {}
245 self._ready_nodes = None
246 self._npassedout = 0
247 self._nfinished = 0
248
249 if graph is not None:
250 for node, predecessors in graph.items():
251 self.add(node, *predecessors)
252
253 def _get_nodeinfo(self, node):
254 if (result := self._node2info.get(node)) is None:
255 self._node2info[node] = result = _NodeInfo(node)
256 return result
257
258 def add(self, node, *predecessors):
259 """Add a new node and its predecessors to the graph.
260
261 Both the *node* and all elements in *predecessors* must be hashable.
262
263 If called multiple times with the same node argument, the set of dependencies
264 will be the union of all dependencies passed in.
265
266 It is possible to add a node with no dependencies (*predecessors* is not provided)
267 as well as provide a dependency twice. If a node that has not been provided before
268 is included among *predecessors* it will be automatically added to the graph with
269 no predecessors of its own.
270
271 Raises ValueError if called after "prepare".
272 """
273 if self._ready_nodes is not None:
274 raise ValueError("Nodes cannot be added after a call to prepare()")
275
276 # Create the node -> predecessor edges
277 nodeinfo = self._get_nodeinfo(node)
278 nodeinfo.npredecessors += len(predecessors)
279
280 # Create the predecessor -> node edges
281 for pred in predecessors:
282 pred_info = self._get_nodeinfo(pred)
283 pred_info.successors.append(node)
284
285 def prepare(self):
286 """Mark the graph as finished and check for cycles in the graph.
287
288 If any cycle is detected, "CycleError" will be raised, but "get_ready" can
289 still be used to obtain as many nodes as possible until cycles block more
290 progress. After a call to this function, the graph cannot be modified and
291 therefore no more nodes can be added using "add".
292 """
293 if self._ready_nodes is not None:
294 raise ValueError("cannot prepare() more than once")
295
296 self._ready_nodes = [i.node for i in self._node2info.values()
297 if i.npredecessors == 0]
298 # ready_nodes is set before we look for cycles on purpose:
299 # if the user wants to catch the CycleError, that's fine,
300 # they can continue using the instance to grab as many
301 # nodes as possible before cycles block more progress
302 cycle = self._find_cycle()
303 if cycle:
304 raise CycleError(f"nodes are in a cycle", cycle)
305
306 def get_ready(self):
307 """Return a tuple of all the nodes that are ready.
308
309 Initially it returns all nodes with no predecessors; once those are marked
310 as processed by calling "done", further calls will return all new nodes that
311 have all their predecessors already processed. Once no more progress can be made,
312 empty tuples are returned.
313
314 Raises ValueError if called without calling "prepare" previously.
315 """
316 if self._ready_nodes is None:
317 raise ValueError("prepare() must be called first")
318
319 # Get the nodes that are ready and mark them
320 result = tuple(self._ready_nodes)
321 n2i = self._node2info
322 for node in result:
323 n2i[node].npredecessors = _NODE_OUT
324
325 # Clean the list of nodes that are ready and update
326 # the counter of nodes that we have returned.
327 self._ready_nodes.clear()
328 self._npassedout += len(result)
329
330 return result
331
332 def is_active(self):
333 """Return True if more progress can be made and ``False`` otherwise.
334
335 Progress can be made if cycles do not block the resolution and either there
336 are still nodes ready that haven't yet been returned by "get_ready" or the
337 number of nodes marked "done" is less than the number that have been returned
338 by "get_ready".
339
340 Raises ValueError if called without calling "prepare" previously.
341 """
342 if self._ready_nodes is None:
343 raise ValueError("prepare() must be called first")
344 return self._nfinished < self._npassedout or bool(self._ready_nodes)
345
346 def __bool__(self):
347 return self.is_active()
348
349 def done(self, *nodes):
350 """Marks a set of nodes returned by "get_ready" as processed.
351
352 This method unblocks any successor of each node in *nodes* for being returned
353 in the future by a a call to "get_ready"
354
355 Raises :exec:`ValueError` if any node in *nodes* has already been marked as
356 processed by a previous call to this method, if a node was not added to the
357 graph by using "add" or if called without calling "prepare" previously or if
358 node has not yet been returned by "get_ready".
359 """
360
361 if self._ready_nodes is None:
362 raise ValueError("prepare() must be called first")
363
364 n2i = self._node2info
365
366 for node in nodes:
367
368 # Check if we know about this node (it was added previously using add()
369 if (nodeinfo := n2i.get(node)) is None:
370 raise ValueError(f"node {node!r} was not added using add()")
371
372 # If the node has not being returned (marked as ready) previously, inform the user.
373 stat = nodeinfo.npredecessors
374 if stat != _NODE_OUT:
375 if stat >= 0:
376 raise ValueError(f"node {node!r} was not passed out (still not ready)")
377 elif stat == _NODE_DONE:
378 raise ValueError(f"node {node!r} was already marked done")
379 else:
380 assert False, f"node {node!r}: unknown status {stat}"
381
382 # Mark the node as processed
383 nodeinfo.npredecessors = _NODE_DONE
384
385 # Go to all the successors and reduce the number of predecessors, collecting all the ones
386 # that are ready to be returned in the next get_ready() call.
387 for successor in nodeinfo.successors:
388 successor_info = n2i[successor]
389 successor_info.npredecessors -= 1
390 if successor_info.npredecessors == 0:
391 self._ready_nodes.append(successor)
392 self._nfinished += 1
393
394 def _find_cycle(self):
395 n2i = self._node2info
396 stack = []
397 itstack = []
398 seen = set()
399 node2stacki = {}
400
401 for node in n2i:
402 if node in seen:
403 continue
404
405 while True:
406 if node in seen:
407 # If we have seen already the node and is in the
408 # current stack we have found a cycle.
409 if node in node2stacki:
410 return stack[node2stacki[node]:] + [node]
411 # else go on to get next successor
412 else:
413 seen.add(node)
414 itstack.append(iter(n2i[node].successors).__next__)
415 node2stacki[node] = len(stack)
416 stack.append(node)
417
418 # Backtrack to the topmost stack entry with
419 # at least another successor.
420 while stack:
421 try:
422 node = itstack[-1]()
423 break
424 except StopIteration:
425 del node2stacki[stack.pop()]
426 itstack.pop()
427 else:
428 break
429 return None
430
431 def static_order(self):
432 """Returns an iterable of nodes in a topological order.
433
434 The particular order that is returned may depend on the specific
435 order in which the items were inserted in the graph.
436
437 Using this method does not require to call "prepare" or "done". If any
438 cycle is detected, :exc:`CycleError` will be raised.
439 """
440 self.prepare()
441 while self.is_active():
442 node_group = self.get_ready()
443 yield from node_group
444 self.done(*node_group)
445
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700446
447################################################################################
448### cmp_to_key() function converter
449################################################################################
450
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000451def cmp_to_key(mycmp):
Georg Brandle5a26732010-05-19 21:06:36 +0000452 """Convert a cmp= function into a key= function"""
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000453 class K(object):
Raymond Hettingera0d1d962011-03-21 17:50:28 -0700454 __slots__ = ['obj']
Raymond Hettinger7ab9e222011-04-05 02:33:54 -0700455 def __init__(self, obj):
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000456 self.obj = obj
457 def __lt__(self, other):
458 return mycmp(self.obj, other.obj) < 0
459 def __gt__(self, other):
460 return mycmp(self.obj, other.obj) > 0
461 def __eq__(self, other):
462 return mycmp(self.obj, other.obj) == 0
463 def __le__(self, other):
464 return mycmp(self.obj, other.obj) <= 0
465 def __ge__(self, other):
466 return mycmp(self.obj, other.obj) >= 0
Raymond Hettinger003be522011-05-03 11:01:32 -0700467 __hash__ = None
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000468 return K
Georg Brandl2e7346a2010-07-31 18:09:23 +0000469
Raymond Hettinger7ab9e222011-04-05 02:33:54 -0700470try:
471 from _functools import cmp_to_key
Brett Cannoncd171c82013-07-04 17:43:24 -0400472except ImportError:
Raymond Hettinger7ab9e222011-04-05 02:33:54 -0700473 pass
474
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700475
476################################################################################
madman-bobe25d5fc2018-10-25 15:02:10 +0100477### reduce() sequence to a single item
478################################################################################
479
480_initial_missing = object()
481
482def reduce(function, sequence, initial=_initial_missing):
483 """
484 reduce(function, sequence[, initial]) -> value
485
486 Apply a function of two arguments cumulatively to the items of a sequence,
487 from left to right, so as to reduce the sequence to a single value.
488 For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
489 ((((1+2)+3)+4)+5). If initial is present, it is placed before the items
490 of the sequence in the calculation, and serves as a default when the
491 sequence is empty.
492 """
493
494 it = iter(sequence)
495
496 if initial is _initial_missing:
497 try:
498 value = next(it)
499 except StopIteration:
500 raise TypeError("reduce() of empty sequence with no initial value") from None
501 else:
502 value = initial
503
504 for element in it:
505 value = function(value, element)
506
507 return value
508
509try:
510 from _functools import reduce
511except ImportError:
512 pass
513
514
515################################################################################
Antoine Pitroub5b37142012-11-13 21:35:40 +0100516### partial() argument application
517################################################################################
518
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000519# Purely functional, no descriptor behaviour
Nick Coghlan457fc9a2016-09-10 20:00:02 +1000520class partial:
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000521 """New function with partial application of the given arguments
Antoine Pitroub5b37142012-11-13 21:35:40 +0100522 and keywords.
523 """
Alexander Belopolskye49af342015-03-01 15:08:17 -0500524
Nick Coghlan457fc9a2016-09-10 20:00:02 +1000525 __slots__ = "func", "args", "keywords", "__dict__", "__weakref__"
526
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300527 def __new__(cls, func, /, *args, **keywords):
Nick Coghlan457fc9a2016-09-10 20:00:02 +1000528 if not callable(func):
529 raise TypeError("the first argument must be callable")
Nick Coghlan457fc9a2016-09-10 20:00:02 +1000530
531 if hasattr(func, "func"):
532 args = func.args + args
Serhiy Storchakada084702019-03-27 08:02:28 +0200533 keywords = {**func.keywords, **keywords}
Nick Coghlan457fc9a2016-09-10 20:00:02 +1000534 func = func.func
535
536 self = super(partial, cls).__new__(cls)
537
538 self.func = func
539 self.args = args
540 self.keywords = keywords
541 return self
542
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300543 def __call__(self, /, *args, **keywords):
Serhiy Storchakada084702019-03-27 08:02:28 +0200544 keywords = {**self.keywords, **keywords}
545 return self.func(*self.args, *args, **keywords)
Nick Coghlan457fc9a2016-09-10 20:00:02 +1000546
547 @recursive_repr()
548 def __repr__(self):
549 qualname = type(self).__qualname__
550 args = [repr(self.func)]
551 args.extend(repr(x) for x in self.args)
552 args.extend(f"{k}={v!r}" for (k, v) in self.keywords.items())
553 if type(self).__module__ == "functools":
554 return f"functools.{qualname}({', '.join(args)})"
555 return f"{qualname}({', '.join(args)})"
556
557 def __reduce__(self):
558 return type(self), (self.func,), (self.func, self.args,
559 self.keywords or None, self.__dict__ or None)
560
561 def __setstate__(self, state):
562 if not isinstance(state, tuple):
563 raise TypeError("argument to __setstate__ must be a tuple")
564 if len(state) != 4:
565 raise TypeError(f"expected 4 items in state, got {len(state)}")
566 func, args, kwds, namespace = state
567 if (not callable(func) or not isinstance(args, tuple) or
568 (kwds is not None and not isinstance(kwds, dict)) or
569 (namespace is not None and not isinstance(namespace, dict))):
570 raise TypeError("invalid partial state")
571
572 args = tuple(args) # just in case it's a subclass
573 if kwds is None:
574 kwds = {}
575 elif type(kwds) is not dict: # XXX does it need to be *exactly* dict?
576 kwds = dict(kwds)
577 if namespace is None:
578 namespace = {}
579
580 self.__dict__ = namespace
581 self.func = func
582 self.args = args
583 self.keywords = kwds
Antoine Pitroub5b37142012-11-13 21:35:40 +0100584
585try:
586 from _functools import partial
Brett Cannoncd171c82013-07-04 17:43:24 -0400587except ImportError:
Antoine Pitroub5b37142012-11-13 21:35:40 +0100588 pass
589
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000590# Descriptor version
591class partialmethod(object):
592 """Method descriptor with partial application of the given arguments
593 and keywords.
594
595 Supports wrapping existing descriptors and handles non-descriptor
596 callables as instance methods.
597 """
598
Serhiy Storchaka142566c2019-06-05 18:22:31 +0300599 def __init__(self, func, /, *args, **keywords):
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000600 if not callable(func) and not hasattr(func, "__get__"):
601 raise TypeError("{!r} is not callable or a descriptor"
602 .format(func))
603
604 # func could be a descriptor like classmethod which isn't callable,
605 # so we can't inherit from partial (it verifies func is callable)
606 if isinstance(func, partialmethod):
607 # flattening is mandatory in order to place cls/self before all
608 # other arguments
609 # it's also more efficient since only one function will be called
610 self.func = func.func
611 self.args = func.args + args
Serhiy Storchakada084702019-03-27 08:02:28 +0200612 self.keywords = {**func.keywords, **keywords}
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000613 else:
614 self.func = func
615 self.args = args
616 self.keywords = keywords
617
618 def __repr__(self):
619 args = ", ".join(map(repr, self.args))
620 keywords = ", ".join("{}={!r}".format(k, v)
621 for k, v in self.keywords.items())
622 format_string = "{module}.{cls}({func}, {args}, {keywords})"
623 return format_string.format(module=self.__class__.__module__,
Serhiy Storchaka521e5862014-07-22 15:00:37 +0300624 cls=self.__class__.__qualname__,
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000625 func=self.func,
626 args=args,
627 keywords=keywords)
628
629 def _make_unbound_method(self):
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300630 def _method(cls_or_self, /, *args, **keywords):
Serhiy Storchakada084702019-03-27 08:02:28 +0200631 keywords = {**self.keywords, **keywords}
632 return self.func(cls_or_self, *self.args, *args, **keywords)
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000633 _method.__isabstractmethod__ = self.__isabstractmethod__
Yury Selivanovda5fe4f2014-01-27 17:28:37 -0500634 _method._partialmethod = self
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000635 return _method
636
Raymond Hettinger0dac68f2019-08-29 01:27:42 -0700637 def __get__(self, obj, cls=None):
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000638 get = getattr(self.func, "__get__", None)
639 result = None
640 if get is not None:
641 new_func = get(obj, cls)
642 if new_func is not self.func:
643 # Assume __get__ returning something new indicates the
644 # creation of an appropriate callable
645 result = partial(new_func, *self.args, **self.keywords)
646 try:
647 result.__self__ = new_func.__self__
648 except AttributeError:
649 pass
650 if result is None:
651 # If the underlying descriptor didn't do anything, treat this
652 # like an instance method
653 result = self._make_unbound_method().__get__(obj, cls)
654 return result
655
656 @property
657 def __isabstractmethod__(self):
658 return getattr(self.func, "__isabstractmethod__", False)
659
Ethan Smithcecf0492020-04-13 21:53:04 -0700660 __class_getitem__ = classmethod(GenericAlias)
661
662
Pablo Galindo7cd25432018-10-26 12:19:14 +0100663# Helper functions
664
665def _unwrap_partial(func):
666 while isinstance(func, partial):
667 func = func.func
668 return func
Antoine Pitroub5b37142012-11-13 21:35:40 +0100669
670################################################################################
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700671### LRU Cache function decorator
672################################################################################
673
Raymond Hettingerdce583e2012-03-16 22:12:20 -0700674_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])
Nick Coghlan234515a2010-11-30 06:19:46 +0000675
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700676class _HashedSeq(list):
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700677 """ This class guarantees that hash() will be called no more than once
678 per element. This is important because the lru_cache() will hash
679 the key multiple times on a cache miss.
680
681 """
682
Raymond Hettinger9acbb602012-04-30 22:32:16 -0700683 __slots__ = 'hashvalue'
684
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700685 def __init__(self, tup, hash=hash):
686 self[:] = tup
687 self.hashvalue = hash(tup)
Raymond Hettinger9acbb602012-04-30 22:32:16 -0700688
689 def __hash__(self):
690 return self.hashvalue
691
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700692def _make_key(args, kwds, typed,
693 kwd_mark = (object(),),
Raymond Hettingerd8080c02019-01-26 03:02:00 -0500694 fasttypes = {int, str},
Raymond Hettinger4ee39142017-01-08 17:28:20 -0800695 tuple=tuple, type=type, len=len):
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700696 """Make a cache key from optionally typed positional and keyword arguments
697
698 The key is constructed in a way that is flat as possible rather than
699 as a nested structure that would take more memory.
700
701 If there is only a single argument and its data type is known to cache
702 its hash value, then that argument is returned without a wrapper. This
703 saves space and improves lookup speed.
704
705 """
Raymond Hettinger55037092017-09-04 17:47:53 -0700706 # All of code below relies on kwds preserving the order input by the user.
707 # Formerly, we sorted() the kwds before looping. The new way is *much*
708 # faster; however, it means that f(x=1, y=2) will now be treated as a
709 # distinct call from f(y=2, x=1) which will be cached separately.
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700710 key = args
711 if kwds:
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700712 key += kwd_mark
Raymond Hettinger4ee39142017-01-08 17:28:20 -0800713 for item in kwds.items():
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700714 key += item
715 if typed:
716 key += tuple(type(v) for v in args)
717 if kwds:
Raymond Hettinger4ee39142017-01-08 17:28:20 -0800718 key += tuple(type(v) for v in kwds.values())
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700719 elif len(key) == 1 and type(key[0]) in fasttypes:
720 return key[0]
721 return _HashedSeq(key)
722
Raymond Hettinger010ce322012-05-19 21:20:48 -0700723def lru_cache(maxsize=128, typed=False):
Benjamin Peterson1f594ad2010-08-08 13:17:07 +0000724 """Least-recently-used cache decorator.
Georg Brandl2e7346a2010-07-31 18:09:23 +0000725
Raymond Hettingerc79fb0e2010-12-01 03:45:41 +0000726 If *maxsize* is set to None, the LRU features are disabled and the cache
727 can grow without bound.
728
Raymond Hettingercd9fdfd2011-10-20 08:57:45 -0700729 If *typed* is True, arguments of different types will be cached separately.
730 For example, f(3.0) and f(3) will be treated as distinct calls with
731 distinct results.
732
Georg Brandl2e7346a2010-07-31 18:09:23 +0000733 Arguments to the cached function must be hashable.
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000734
Raymond Hettinger7f7a5a72012-03-30 21:50:40 -0700735 View the cache statistics named tuple (hits, misses, maxsize, currsize)
736 with f.cache_info(). Clear the cache and statistics with f.cache_clear().
Raymond Hettinger00f2f972010-12-01 00:47:56 +0000737 Access the underlying function with f.__wrapped__.
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000738
amist336b3062019-09-16 21:36:14 +0300739 See: http://en.wikipedia.org/wiki/Cache_replacement_policies#Least_recently_used_(LRU)
Georg Brandl2e7346a2010-07-31 18:09:23 +0000740
Benjamin Peterson1f594ad2010-08-08 13:17:07 +0000741 """
Raymond Hettinger1ff50df2012-03-30 13:15:48 -0700742
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000743 # Users should only access the lru_cache through its public API:
Raymond Hettinger5e20bab2010-11-30 07:13:04 +0000744 # cache_info, cache_clear, and f.__wrapped__
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000745 # The internals of the lru_cache are encapsulated for thread safety and
746 # to allow the implementation to change (including a possible C version).
747
Raymond Hettingerd8080c02019-01-26 03:02:00 -0500748 if isinstance(maxsize, int):
Raymond Hettingerb8218682019-05-26 11:27:35 -0700749 # Negative maxsize is treated as 0
Raymond Hettingerd8080c02019-01-26 03:02:00 -0500750 if maxsize < 0:
751 maxsize = 0
Raymond Hettingerb8218682019-05-26 11:27:35 -0700752 elif callable(maxsize) and isinstance(typed, bool):
753 # The user_function was passed in directly via the maxsize argument
754 user_function, maxsize = maxsize, 128
755 wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo)
Manjusaka051ff522019-11-12 15:30:18 +0800756 wrapper.cache_parameters = lambda : {'maxsize': maxsize, 'typed': typed}
Raymond Hettingerb8218682019-05-26 11:27:35 -0700757 return update_wrapper(wrapper, user_function)
Raymond Hettingerd8080c02019-01-26 03:02:00 -0500758 elif maxsize is not None:
Raymond Hettingerb8218682019-05-26 11:27:35 -0700759 raise TypeError(
760 'Expected first argument to be an integer, a callable, or None')
Raymond Hettinger4d588972014-08-12 12:44:52 -0700761
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300762 def decorating_function(user_function):
763 wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo)
Manjusaka051ff522019-11-12 15:30:18 +0800764 wrapper.cache_parameters = lambda : {'maxsize': maxsize, 'typed': typed}
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300765 return update_wrapper(wrapper, user_function)
766
767 return decorating_function
768
769def _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo):
Raymond Hettinger9f0ab9f2012-04-29 14:55:27 -0700770 # Constants shared by all lru cache instances:
Raymond Hettingerb6b98c02012-04-29 18:09:02 -0700771 sentinel = object() # unique object used to signal cache misses
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700772 make_key = _make_key # build a key from the function arguments
Raymond Hettinger9f0ab9f2012-04-29 14:55:27 -0700773 PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields
774
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300775 cache = {}
776 hits = misses = 0
777 full = False
778 cache_get = cache.get # bound method to lookup a key or return None
Raymond Hettingerb2d4b3d2016-12-16 14:59:37 -0800779 cache_len = cache.__len__ # get cache size without calling len()
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300780 lock = RLock() # because linkedlist updates aren't threadsafe
781 root = [] # root of the circular doubly linked list
782 root[:] = [root, root, None, None] # initialize by pointing to self
Raymond Hettinger6e8c8172012-03-16 16:53:05 -0700783
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300784 if maxsize == 0:
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700785
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300786 def wrapper(*args, **kwds):
Raymond Hettingerffdf1c32019-01-31 15:03:38 -0800787 # No caching -- just a statistics update
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300788 nonlocal misses
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300789 misses += 1
Raymond Hettingerffdf1c32019-01-31 15:03:38 -0800790 result = user_function(*args, **kwds)
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300791 return result
792
793 elif maxsize is None:
794
795 def wrapper(*args, **kwds):
796 # Simple caching without ordering or size limit
797 nonlocal hits, misses
798 key = make_key(args, kwds, typed)
799 result = cache_get(key, sentinel)
800 if result is not sentinel:
801 hits += 1
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700802 return result
Raymond Hettingerffdf1c32019-01-31 15:03:38 -0800803 misses += 1
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300804 result = user_function(*args, **kwds)
805 cache[key] = result
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300806 return result
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700807
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300808 else:
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700809
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300810 def wrapper(*args, **kwds):
811 # Size limited caching that tracks accesses by recency
812 nonlocal root, hits, misses, full
813 key = make_key(args, kwds, typed)
814 with lock:
815 link = cache_get(key)
816 if link is not None:
817 # Move the link to the front of the circular queue
818 link_prev, link_next, _key, result = link
819 link_prev[NEXT] = link_next
820 link_next[PREV] = link_prev
821 last = root[PREV]
822 last[NEXT] = root[PREV] = link
823 link[PREV] = last
824 link[NEXT] = root
Nick Coghlan234515a2010-11-30 06:19:46 +0000825 hits += 1
Raymond Hettinger4b779b32011-10-15 23:50:42 -0700826 return result
Raymond Hettingerd8080c02019-01-26 03:02:00 -0500827 misses += 1
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300828 result = user_function(*args, **kwds)
829 with lock:
830 if key in cache:
831 # Getting here means that this same key was added to the
832 # cache while the lock was released. Since the link
833 # update is already done, we need only return the
834 # computed result and update the count of misses.
835 pass
836 elif full:
837 # Use the old root to store the new key and result.
838 oldroot = root
839 oldroot[KEY] = key
840 oldroot[RESULT] = result
841 # Empty the oldest link and make it the new root.
842 # Keep a reference to the old key and old result to
843 # prevent their ref counts from going to zero during the
844 # update. That will prevent potentially arbitrary object
845 # clean-up code (i.e. __del__) from running while we're
846 # still adjusting the links.
847 root = oldroot[NEXT]
848 oldkey = root[KEY]
849 oldresult = root[RESULT]
850 root[KEY] = root[RESULT] = None
851 # Now update the cache dictionary.
852 del cache[oldkey]
853 # Save the potentially reentrant cache[key] assignment
854 # for last, after the root and links have been put in
855 # a consistent state.
856 cache[key] = oldroot
857 else:
858 # Put result in a new link at the front of the queue.
859 last = root[PREV]
860 link = [last, root, key, result]
861 last[NEXT] = root[PREV] = cache[key] = link
Raymond Hettingerb2d4b3d2016-12-16 14:59:37 -0800862 # Use the cache_len bound method instead of the len() function
Raymond Hettingeraf56e0e2016-12-16 13:57:40 -0800863 # which could potentially be wrapped in an lru_cache itself.
Raymond Hettingerb2d4b3d2016-12-16 14:59:37 -0800864 full = (cache_len() >= maxsize)
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300865 return result
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700866
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300867 def cache_info():
868 """Report cache statistics"""
869 with lock:
Raymond Hettingerb2d4b3d2016-12-16 14:59:37 -0800870 return _CacheInfo(hits, misses, maxsize, cache_len())
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700871
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300872 def cache_clear():
873 """Clear the cache and cache statistics"""
874 nonlocal hits, misses, full
875 with lock:
876 cache.clear()
877 root[:] = [root, root, None, None]
878 hits = misses = 0
879 full = False
Georg Brandl2e7346a2010-07-31 18:09:23 +0000880
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300881 wrapper.cache_info = cache_info
882 wrapper.cache_clear = cache_clear
Serhiy Storchakace2295d2015-10-24 09:51:53 +0300883 return wrapper
Nick Coghlan234515a2010-11-30 06:19:46 +0000884
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300885try:
886 from _functools import _lru_cache_wrapper
887except ImportError:
888 pass
Łukasz Langa6f692512013-06-05 12:20:24 +0200889
890
891################################################################################
892### singledispatch() - single-dispatch generic function decorator
893################################################################################
894
Łukasz Langa3720c772013-07-01 16:00:38 +0200895def _c3_merge(sequences):
896 """Merges MROs in *sequences* to a single MRO using the C3 algorithm.
897
898 Adapted from http://www.python.org/download/releases/2.3/mro/.
899
900 """
901 result = []
902 while True:
903 sequences = [s for s in sequences if s] # purge empty sequences
904 if not sequences:
905 return result
906 for s1 in sequences: # find merge candidates among seq heads
907 candidate = s1[0]
908 for s2 in sequences:
909 if candidate in s2[1:]:
910 candidate = None
911 break # reject the current head, it appears later
912 else:
913 break
Yury Selivanov77a8cd62015-08-18 14:20:00 -0400914 if candidate is None:
Łukasz Langa3720c772013-07-01 16:00:38 +0200915 raise RuntimeError("Inconsistent hierarchy")
916 result.append(candidate)
917 # remove the chosen candidate
918 for seq in sequences:
919 if seq[0] == candidate:
920 del seq[0]
921
922def _c3_mro(cls, abcs=None):
923 """Computes the method resolution order using extended C3 linearization.
924
925 If no *abcs* are given, the algorithm works exactly like the built-in C3
926 linearization used for method resolution.
927
928 If given, *abcs* is a list of abstract base classes that should be inserted
929 into the resulting MRO. Unrelated ABCs are ignored and don't end up in the
930 result. The algorithm inserts ABCs where their functionality is introduced,
931 i.e. issubclass(cls, abc) returns True for the class itself but returns
932 False for all its direct base classes. Implicit ABCs for a given class
933 (either registered or inferred from the presence of a special method like
934 __len__) are inserted directly after the last ABC explicitly listed in the
935 MRO of said class. If two implicit ABCs end up next to each other in the
936 resulting MRO, their ordering depends on the order of types in *abcs*.
937
938 """
939 for i, base in enumerate(reversed(cls.__bases__)):
940 if hasattr(base, '__abstractmethods__'):
941 boundary = len(cls.__bases__) - i
942 break # Bases up to the last explicit ABC are considered first.
943 else:
944 boundary = 0
945 abcs = list(abcs) if abcs else []
946 explicit_bases = list(cls.__bases__[:boundary])
947 abstract_bases = []
948 other_bases = list(cls.__bases__[boundary:])
949 for base in abcs:
950 if issubclass(cls, base) and not any(
951 issubclass(b, base) for b in cls.__bases__
952 ):
953 # If *cls* is the class that introduces behaviour described by
954 # an ABC *base*, insert said ABC to its MRO.
955 abstract_bases.append(base)
956 for base in abstract_bases:
957 abcs.remove(base)
958 explicit_c3_mros = [_c3_mro(base, abcs=abcs) for base in explicit_bases]
959 abstract_c3_mros = [_c3_mro(base, abcs=abcs) for base in abstract_bases]
960 other_c3_mros = [_c3_mro(base, abcs=abcs) for base in other_bases]
961 return _c3_merge(
962 [[cls]] +
963 explicit_c3_mros + abstract_c3_mros + other_c3_mros +
964 [explicit_bases] + [abstract_bases] + [other_bases]
965 )
966
967def _compose_mro(cls, types):
968 """Calculates the method resolution order for a given class *cls*.
969
970 Includes relevant abstract base classes (with their respective bases) from
971 the *types* iterable. Uses a modified C3 linearization algorithm.
Łukasz Langa6f692512013-06-05 12:20:24 +0200972
973 """
974 bases = set(cls.__mro__)
Łukasz Langa3720c772013-07-01 16:00:38 +0200975 # Remove entries which are already present in the __mro__ or unrelated.
976 def is_related(typ):
977 return (typ not in bases and hasattr(typ, '__mro__')
978 and issubclass(cls, typ))
979 types = [n for n in types if is_related(n)]
980 # Remove entries which are strict bases of other entries (they will end up
981 # in the MRO anyway.
982 def is_strict_base(typ):
983 for other in types:
984 if typ != other and typ in other.__mro__:
985 return True
986 return False
987 types = [n for n in types if not is_strict_base(n)]
988 # Subclasses of the ABCs in *types* which are also implemented by
989 # *cls* can be used to stabilize ABC ordering.
990 type_set = set(types)
991 mro = []
992 for typ in types:
993 found = []
994 for sub in typ.__subclasses__():
995 if sub not in bases and issubclass(cls, sub):
996 found.append([s for s in sub.__mro__ if s in type_set])
997 if not found:
998 mro.append(typ)
999 continue
1000 # Favor subclasses with the biggest number of useful bases
1001 found.sort(key=len, reverse=True)
1002 for sub in found:
1003 for subcls in sub:
1004 if subcls not in mro:
1005 mro.append(subcls)
1006 return _c3_mro(cls, abcs=mro)
Łukasz Langa6f692512013-06-05 12:20:24 +02001007
1008def _find_impl(cls, registry):
Łukasz Langa3720c772013-07-01 16:00:38 +02001009 """Returns the best matching implementation from *registry* for type *cls*.
Łukasz Langa6f692512013-06-05 12:20:24 +02001010
Łukasz Langa3720c772013-07-01 16:00:38 +02001011 Where there is no registered implementation for a specific type, its method
1012 resolution order is used to find a more generic implementation.
1013
1014 Note: if *registry* does not contain an implementation for the base
1015 *object* type, this function may return None.
Łukasz Langa6f692512013-06-05 12:20:24 +02001016
1017 """
1018 mro = _compose_mro(cls, registry.keys())
1019 match = None
1020 for t in mro:
1021 if match is not None:
Łukasz Langa3720c772013-07-01 16:00:38 +02001022 # If *match* is an implicit ABC but there is another unrelated,
1023 # equally matching implicit ABC, refuse the temptation to guess.
1024 if (t in registry and t not in cls.__mro__
1025 and match not in cls.__mro__
1026 and not issubclass(match, t)):
Łukasz Langa6f692512013-06-05 12:20:24 +02001027 raise RuntimeError("Ambiguous dispatch: {} or {}".format(
1028 match, t))
1029 break
1030 if t in registry:
1031 match = t
1032 return registry.get(match)
1033
1034def singledispatch(func):
1035 """Single-dispatch generic function decorator.
1036
1037 Transforms a function into a generic function, which can have different
1038 behaviours depending upon the type of its first argument. The decorated
1039 function acts as the default implementation, and additional
Łukasz Langa3720c772013-07-01 16:00:38 +02001040 implementations can be registered using the register() attribute of the
1041 generic function.
Łukasz Langa6f692512013-06-05 12:20:24 +02001042 """
INADA Naoki9811e802017-09-30 16:13:02 +09001043 # There are many programs that use functools without singledispatch, so we
1044 # trade-off making singledispatch marginally slower for the benefit of
1045 # making start-up of such applications slightly faster.
1046 import types, weakref
1047
Łukasz Langa6f692512013-06-05 12:20:24 +02001048 registry = {}
INADA Naoki9811e802017-09-30 16:13:02 +09001049 dispatch_cache = weakref.WeakKeyDictionary()
Łukasz Langa6f692512013-06-05 12:20:24 +02001050 cache_token = None
1051
Łukasz Langa3720c772013-07-01 16:00:38 +02001052 def dispatch(cls):
1053 """generic_func.dispatch(cls) -> <function implementation>
Łukasz Langa6f692512013-06-05 12:20:24 +02001054
1055 Runs the dispatch algorithm to return the best available implementation
Łukasz Langa3720c772013-07-01 16:00:38 +02001056 for the given *cls* registered on *generic_func*.
Łukasz Langa6f692512013-06-05 12:20:24 +02001057
1058 """
1059 nonlocal cache_token
1060 if cache_token is not None:
1061 current_token = get_cache_token()
1062 if cache_token != current_token:
1063 dispatch_cache.clear()
1064 cache_token = current_token
1065 try:
Łukasz Langa3720c772013-07-01 16:00:38 +02001066 impl = dispatch_cache[cls]
Łukasz Langa6f692512013-06-05 12:20:24 +02001067 except KeyError:
1068 try:
Łukasz Langa3720c772013-07-01 16:00:38 +02001069 impl = registry[cls]
Łukasz Langa6f692512013-06-05 12:20:24 +02001070 except KeyError:
Łukasz Langa3720c772013-07-01 16:00:38 +02001071 impl = _find_impl(cls, registry)
1072 dispatch_cache[cls] = impl
Łukasz Langa6f692512013-06-05 12:20:24 +02001073 return impl
1074
Łukasz Langa3720c772013-07-01 16:00:38 +02001075 def register(cls, func=None):
1076 """generic_func.register(cls, func) -> func
Łukasz Langa6f692512013-06-05 12:20:24 +02001077
Łukasz Langa3720c772013-07-01 16:00:38 +02001078 Registers a new implementation for the given *cls* on a *generic_func*.
Łukasz Langa6f692512013-06-05 12:20:24 +02001079
1080 """
1081 nonlocal cache_token
1082 if func is None:
Łukasz Langae5697532017-12-11 13:56:31 -08001083 if isinstance(cls, type):
1084 return lambda f: register(cls, f)
1085 ann = getattr(cls, '__annotations__', {})
1086 if not ann:
1087 raise TypeError(
1088 f"Invalid first argument to `register()`: {cls!r}. "
1089 f"Use either `@register(some_class)` or plain `@register` "
1090 f"on an annotated function."
1091 )
1092 func = cls
1093
1094 # only import typing if annotation parsing is necessary
1095 from typing import get_type_hints
1096 argname, cls = next(iter(get_type_hints(func).items()))
Lysandros Nikolaoud6738102019-05-20 00:11:21 +02001097 if not isinstance(cls, type):
1098 raise TypeError(
1099 f"Invalid annotation for {argname!r}. "
1100 f"{cls!r} is not a class."
1101 )
Łukasz Langa3720c772013-07-01 16:00:38 +02001102 registry[cls] = func
1103 if cache_token is None and hasattr(cls, '__abstractmethods__'):
Łukasz Langa6f692512013-06-05 12:20:24 +02001104 cache_token = get_cache_token()
1105 dispatch_cache.clear()
1106 return func
1107
1108 def wrapper(*args, **kw):
Dong-hee Na445f1b32018-07-10 16:26:36 +09001109 if not args:
1110 raise TypeError(f'{funcname} requires at least '
1111 '1 positional argument')
1112
Łukasz Langa6f692512013-06-05 12:20:24 +02001113 return dispatch(args[0].__class__)(*args, **kw)
1114
Dong-hee Na445f1b32018-07-10 16:26:36 +09001115 funcname = getattr(func, '__name__', 'singledispatch function')
Łukasz Langa6f692512013-06-05 12:20:24 +02001116 registry[object] = func
1117 wrapper.register = register
1118 wrapper.dispatch = dispatch
INADA Naoki9811e802017-09-30 16:13:02 +09001119 wrapper.registry = types.MappingProxyType(registry)
Łukasz Langa6f692512013-06-05 12:20:24 +02001120 wrapper._clear_cache = dispatch_cache.clear
1121 update_wrapper(wrapper, func)
1122 return wrapper
Ethan Smithc6512752018-05-26 16:38:33 -04001123
1124
1125# Descriptor version
1126class singledispatchmethod:
1127 """Single-dispatch generic method descriptor.
1128
1129 Supports wrapping existing descriptors and handles non-descriptor
1130 callables as instance methods.
1131 """
1132
1133 def __init__(self, func):
1134 if not callable(func) and not hasattr(func, "__get__"):
1135 raise TypeError(f"{func!r} is not callable or a descriptor")
1136
1137 self.dispatcher = singledispatch(func)
1138 self.func = func
1139
1140 def register(self, cls, method=None):
1141 """generic_method.register(cls, func) -> func
1142
1143 Registers a new implementation for the given *cls* on a *generic_method*.
1144 """
1145 return self.dispatcher.register(cls, func=method)
1146
Raymond Hettinger0dac68f2019-08-29 01:27:42 -07001147 def __get__(self, obj, cls=None):
Ethan Smithc6512752018-05-26 16:38:33 -04001148 def _method(*args, **kwargs):
1149 method = self.dispatcher.dispatch(args[0].__class__)
1150 return method.__get__(obj, cls)(*args, **kwargs)
1151
1152 _method.__isabstractmethod__ = self.__isabstractmethod__
1153 _method.register = self.register
1154 update_wrapper(_method, self.func)
1155 return _method
1156
1157 @property
1158 def __isabstractmethod__(self):
1159 return getattr(self.func, '__isabstractmethod__', False)
Carl Meyerd658dea2018-08-28 01:11:56 -06001160
1161
1162################################################################################
1163### cached_property() - computed once per instance, cached as attribute
1164################################################################################
1165
1166_NOT_FOUND = object()
1167
1168
1169class cached_property:
1170 def __init__(self, func):
1171 self.func = func
1172 self.attrname = None
1173 self.__doc__ = func.__doc__
1174 self.lock = RLock()
1175
1176 def __set_name__(self, owner, name):
1177 if self.attrname is None:
1178 self.attrname = name
1179 elif name != self.attrname:
1180 raise TypeError(
1181 "Cannot assign the same cached_property to two different names "
1182 f"({self.attrname!r} and {name!r})."
1183 )
1184
Raymond Hettinger0dac68f2019-08-29 01:27:42 -07001185 def __get__(self, instance, owner=None):
Carl Meyerd658dea2018-08-28 01:11:56 -06001186 if instance is None:
1187 return self
1188 if self.attrname is None:
1189 raise TypeError(
1190 "Cannot use cached_property instance without calling __set_name__ on it.")
1191 try:
1192 cache = instance.__dict__
1193 except AttributeError: # not all objects have __dict__ (e.g. class defines slots)
1194 msg = (
1195 f"No '__dict__' attribute on {type(instance).__name__!r} "
1196 f"instance to cache {self.attrname!r} property."
1197 )
1198 raise TypeError(msg) from None
1199 val = cache.get(self.attrname, _NOT_FOUND)
1200 if val is _NOT_FOUND:
1201 with self.lock:
1202 # check if another thread filled cache while we awaited lock
1203 val = cache.get(self.attrname, _NOT_FOUND)
1204 if val is _NOT_FOUND:
1205 val = self.func(instance)
1206 try:
1207 cache[self.attrname] = val
1208 except TypeError:
1209 msg = (
1210 f"The '__dict__' attribute on {type(instance).__name__!r} instance "
1211 f"does not support item assignment for caching {self.attrname!r} property."
1212 )
1213 raise TypeError(msg) from None
1214 return val
Ethan Smithcecf0492020-04-13 21:53:04 -07001215
1216 __class_getitem__ = classmethod(GenericAlias)