blob: 60cf3c41876d80547126492ff1df4660d00e3d4b [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',
Nick Coghlan3daaf5f2013-11-04 23:32:16 +100014 'partialmethod', 'singledispatch']
Georg Brandl2e7346a2010-07-31 18:09:23 +000015
Antoine Pitroub5b37142012-11-13 21:35:40 +010016try:
17 from _functools import reduce
Brett Cannoncd171c82013-07-04 17:43:24 -040018except ImportError:
Antoine Pitroub5b37142012-11-13 21:35:40 +010019 pass
Łukasz Langa6f692512013-06-05 12:20:24 +020020from abc import get_cache_token
Raymond Hettingerec0e9102012-03-16 01:16:31 -070021from collections import namedtuple
Victor Stinner7fa767e2014-03-20 09:16:38 +010022from types import MappingProxyType
Łukasz Langa6f692512013-06-05 12:20:24 +020023from weakref import WeakKeyDictionary
Raymond Hettingercbe88132010-08-14 22:22:10 +000024try:
Raymond Hettingerfd541172013-03-01 03:47:57 -080025 from _thread import RLock
Serhiy Storchakaba9ac5b2015-05-20 10:33:40 +030026except ImportError:
Raymond Hettinger409f6632013-03-01 23:20:13 -080027 class RLock:
Raymond Hettingerf96b2b02013-03-08 21:11:55 -070028 'Dummy reentrant lock for builds without threads'
Raymond Hettinger409f6632013-03-01 23:20:13 -080029 def __enter__(self): pass
30 def __exit__(self, exctype, excinst, exctb): pass
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000031
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -070032
33################################################################################
34### update_wrapper() and wraps() decorator
35################################################################################
36
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000037# update_wrapper() and wraps() are tools to help write
38# wrapper functions that can handle naive introspection
39
Meador Ingeff7f64c2011-12-11 22:37:31 -060040WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__qualname__', '__doc__',
41 '__annotations__')
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000042WRAPPER_UPDATES = ('__dict__',)
43def update_wrapper(wrapper,
44 wrapped,
45 assigned = WRAPPER_ASSIGNMENTS,
46 updated = WRAPPER_UPDATES):
47 """Update a wrapper function to look like the wrapped function
48
49 wrapper is the function to be updated
50 wrapped is the original function
51 assigned is a tuple naming the attributes assigned directly
52 from the wrapped function to the wrapper function (defaults to
53 functools.WRAPPER_ASSIGNMENTS)
Thomas Wouters89f507f2006-12-13 04:49:30 +000054 updated is a tuple naming the attributes of the wrapper that
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000055 are updated with the corresponding attribute from the wrapped
56 function (defaults to functools.WRAPPER_UPDATES)
57 """
58 for attr in assigned:
Nick Coghlan98876832010-08-17 06:17:18 +000059 try:
60 value = getattr(wrapped, attr)
61 except AttributeError:
62 pass
63 else:
64 setattr(wrapper, attr, value)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000065 for attr in updated:
Thomas Wouters89f507f2006-12-13 04:49:30 +000066 getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
Nick Coghlan24c05bc2013-07-15 21:13:08 +100067 # Issue #17482: set __wrapped__ last so we don't inadvertently copy it
68 # from the wrapped function when updating __dict__
69 wrapper.__wrapped__ = wrapped
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000070 # Return the wrapper so this can be used as a decorator via partial()
71 return wrapper
72
73def wraps(wrapped,
74 assigned = WRAPPER_ASSIGNMENTS,
75 updated = WRAPPER_UPDATES):
76 """Decorator factory to apply update_wrapper() to a wrapper function
77
78 Returns a decorator that invokes update_wrapper() with the decorated
79 function as the wrapper argument and the arguments to wraps() as the
80 remaining arguments. Default arguments are as for update_wrapper().
81 This is a convenience function to simplify applying partial() to
82 update_wrapper().
83 """
84 return partial(update_wrapper, wrapped=wrapped,
85 assigned=assigned, updated=updated)
Raymond Hettingerc50846a2010-04-05 18:56:31 +000086
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -070087
88################################################################################
89### total_ordering class decorator
90################################################################################
91
Raymond Hettinger0603d302015-01-05 21:52:10 -080092# The total ordering functions all invoke the root magic method directly
93# rather than using the corresponding operator. This avoids possible
94# infinite recursion that could occur when the operator dispatch logic
95# detects a NotImplemented result and then calls a reflected method.
Nick Coghlanf05d9812013-10-02 00:02:03 +100096
Raymond Hettingerffcd8492015-05-12 21:26:37 -070097def _gt_from_lt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -080098 'Return a > b. Computed by @total_ordering from (not a < b) and (a != b).'
99 op_result = self.__lt__(other)
Nick Coghlanf05d9812013-10-02 00:02:03 +1000100 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800101 return op_result
Nick Coghlanf05d9812013-10-02 00:02:03 +1000102 return not op_result and self != other
103
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700104def _le_from_lt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800105 'Return a <= b. Computed by @total_ordering from (a < b) or (a == b).'
106 op_result = self.__lt__(other)
107 return op_result or self == other
108
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700109def _ge_from_lt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800110 'Return a >= b. Computed by @total_ordering from (not a < b).'
111 op_result = self.__lt__(other)
112 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800113 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800114 return not op_result
115
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700116def _ge_from_le(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800117 'Return a >= b. Computed by @total_ordering from (not a <= b) or (a == b).'
118 op_result = self.__le__(other)
Nick Coghlanf05d9812013-10-02 00:02:03 +1000119 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800120 return op_result
Nick Coghlanf05d9812013-10-02 00:02:03 +1000121 return not op_result or self == other
122
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700123def _lt_from_le(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800124 'Return a < b. Computed by @total_ordering from (a <= b) and (a != b).'
125 op_result = self.__le__(other)
Nick Coghlanf05d9812013-10-02 00:02:03 +1000126 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800127 return op_result
Nick Coghlanf05d9812013-10-02 00:02:03 +1000128 return op_result and self != other
129
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700130def _gt_from_le(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800131 'Return a > b. Computed by @total_ordering from (not a <= b).'
132 op_result = self.__le__(other)
133 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800134 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800135 return not op_result
136
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700137def _lt_from_gt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800138 'Return a < b. Computed by @total_ordering from (not a > b) and (a != b).'
139 op_result = self.__gt__(other)
140 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800141 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800142 return not op_result and self != other
143
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700144def _ge_from_gt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800145 'Return a >= b. Computed by @total_ordering from (a > b) or (a == b).'
146 op_result = self.__gt__(other)
147 return op_result or self == other
148
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700149def _le_from_gt(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800150 'Return a <= b. Computed by @total_ordering from (not a > b).'
151 op_result = self.__gt__(other)
152 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800153 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800154 return not op_result
155
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700156def _le_from_ge(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800157 'Return a <= b. Computed by @total_ordering from (not a >= b) or (a == b).'
158 op_result = self.__ge__(other)
159 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800160 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800161 return not op_result or self == other
162
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700163def _gt_from_ge(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800164 'Return a > b. Computed by @total_ordering from (a >= b) and (a != b).'
165 op_result = self.__ge__(other)
166 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800167 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800168 return op_result and self != other
169
Raymond Hettingerffcd8492015-05-12 21:26:37 -0700170def _lt_from_ge(self, other, NotImplemented=NotImplemented):
Raymond Hettinger0603d302015-01-05 21:52:10 -0800171 'Return a < b. Computed by @total_ordering from (not a >= b).'
172 op_result = self.__ge__(other)
173 if op_result is NotImplemented:
Raymond Hettingere5db8632015-01-06 22:16:10 -0800174 return op_result
Raymond Hettinger0603d302015-01-05 21:52:10 -0800175 return not op_result
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000176
Raymond Hettinger1a8ada82015-01-13 22:57:35 -0800177_convert = {
178 '__lt__': [('__gt__', _gt_from_lt),
179 ('__le__', _le_from_lt),
180 ('__ge__', _ge_from_lt)],
181 '__le__': [('__ge__', _ge_from_le),
182 ('__lt__', _lt_from_le),
183 ('__gt__', _gt_from_le)],
184 '__gt__': [('__lt__', _lt_from_gt),
185 ('__ge__', _ge_from_gt),
186 ('__le__', _le_from_gt)],
187 '__ge__': [('__le__', _le_from_ge),
188 ('__gt__', _gt_from_ge),
189 ('__lt__', _lt_from_ge)]
190}
191
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000192def total_ordering(cls):
Georg Brandle5a26732010-05-19 21:06:36 +0000193 """Class decorator that fills in missing ordering methods"""
Raymond Hettinger3255c632010-09-16 00:31:21 +0000194 # Find user-defined comparisons (not those inherited from object).
Raymond Hettinger1a8ada82015-01-13 22:57:35 -0800195 roots = [op for op in _convert if getattr(cls, op, None) is not getattr(object, op, None)]
Raymond Hettinger56de7e22010-04-10 16:59:03 +0000196 if not roots:
197 raise ValueError('must define at least one ordering operation: < > <= >=')
198 root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__
Raymond Hettinger1a8ada82015-01-13 22:57:35 -0800199 for opname, opfunc in _convert[root]:
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000200 if opname not in roots:
201 opfunc.__name__ = opname
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000202 setattr(cls, opname, opfunc)
203 return cls
204
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700205
206################################################################################
207### cmp_to_key() function converter
208################################################################################
209
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000210def cmp_to_key(mycmp):
Georg Brandle5a26732010-05-19 21:06:36 +0000211 """Convert a cmp= function into a key= function"""
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000212 class K(object):
Raymond Hettingera0d1d962011-03-21 17:50:28 -0700213 __slots__ = ['obj']
Raymond Hettinger7ab9e222011-04-05 02:33:54 -0700214 def __init__(self, obj):
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000215 self.obj = obj
216 def __lt__(self, other):
217 return mycmp(self.obj, other.obj) < 0
218 def __gt__(self, other):
219 return mycmp(self.obj, other.obj) > 0
220 def __eq__(self, other):
221 return mycmp(self.obj, other.obj) == 0
222 def __le__(self, other):
223 return mycmp(self.obj, other.obj) <= 0
224 def __ge__(self, other):
225 return mycmp(self.obj, other.obj) >= 0
Raymond Hettinger003be522011-05-03 11:01:32 -0700226 __hash__ = None
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000227 return K
Georg Brandl2e7346a2010-07-31 18:09:23 +0000228
Raymond Hettinger7ab9e222011-04-05 02:33:54 -0700229try:
230 from _functools import cmp_to_key
Brett Cannoncd171c82013-07-04 17:43:24 -0400231except ImportError:
Raymond Hettinger7ab9e222011-04-05 02:33:54 -0700232 pass
233
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700234
235################################################################################
Antoine Pitroub5b37142012-11-13 21:35:40 +0100236### partial() argument application
237################################################################################
238
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000239# Purely functional, no descriptor behaviour
Antoine Pitroub5b37142012-11-13 21:35:40 +0100240def partial(func, *args, **keywords):
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000241 """New function with partial application of the given arguments
Antoine Pitroub5b37142012-11-13 21:35:40 +0100242 and keywords.
243 """
Alexander Belopolskye49af342015-03-01 15:08:17 -0500244 if hasattr(func, 'func'):
245 args = func.args + args
246 tmpkw = func.keywords.copy()
247 tmpkw.update(keywords)
248 keywords = tmpkw
249 del tmpkw
250 func = func.func
251
Antoine Pitroub5b37142012-11-13 21:35:40 +0100252 def newfunc(*fargs, **fkeywords):
253 newkeywords = keywords.copy()
254 newkeywords.update(fkeywords)
255 return func(*(args + fargs), **newkeywords)
256 newfunc.func = func
257 newfunc.args = args
258 newfunc.keywords = keywords
259 return newfunc
260
261try:
262 from _functools import partial
Brett Cannoncd171c82013-07-04 17:43:24 -0400263except ImportError:
Antoine Pitroub5b37142012-11-13 21:35:40 +0100264 pass
265
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000266# Descriptor version
267class partialmethod(object):
268 """Method descriptor with partial application of the given arguments
269 and keywords.
270
271 Supports wrapping existing descriptors and handles non-descriptor
272 callables as instance methods.
273 """
274
275 def __init__(self, func, *args, **keywords):
276 if not callable(func) and not hasattr(func, "__get__"):
277 raise TypeError("{!r} is not callable or a descriptor"
278 .format(func))
279
280 # func could be a descriptor like classmethod which isn't callable,
281 # so we can't inherit from partial (it verifies func is callable)
282 if isinstance(func, partialmethod):
283 # flattening is mandatory in order to place cls/self before all
284 # other arguments
285 # it's also more efficient since only one function will be called
286 self.func = func.func
287 self.args = func.args + args
288 self.keywords = func.keywords.copy()
289 self.keywords.update(keywords)
290 else:
291 self.func = func
292 self.args = args
293 self.keywords = keywords
294
295 def __repr__(self):
296 args = ", ".join(map(repr, self.args))
297 keywords = ", ".join("{}={!r}".format(k, v)
298 for k, v in self.keywords.items())
299 format_string = "{module}.{cls}({func}, {args}, {keywords})"
300 return format_string.format(module=self.__class__.__module__,
Serhiy Storchaka521e5862014-07-22 15:00:37 +0300301 cls=self.__class__.__qualname__,
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000302 func=self.func,
303 args=args,
304 keywords=keywords)
305
306 def _make_unbound_method(self):
307 def _method(*args, **keywords):
308 call_keywords = self.keywords.copy()
309 call_keywords.update(keywords)
310 cls_or_self, *rest = args
311 call_args = (cls_or_self,) + self.args + tuple(rest)
312 return self.func(*call_args, **call_keywords)
313 _method.__isabstractmethod__ = self.__isabstractmethod__
Yury Selivanovda5fe4f2014-01-27 17:28:37 -0500314 _method._partialmethod = self
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000315 return _method
316
317 def __get__(self, obj, cls):
318 get = getattr(self.func, "__get__", None)
319 result = None
320 if get is not None:
321 new_func = get(obj, cls)
322 if new_func is not self.func:
323 # Assume __get__ returning something new indicates the
324 # creation of an appropriate callable
325 result = partial(new_func, *self.args, **self.keywords)
326 try:
327 result.__self__ = new_func.__self__
328 except AttributeError:
329 pass
330 if result is None:
331 # If the underlying descriptor didn't do anything, treat this
332 # like an instance method
333 result = self._make_unbound_method().__get__(obj, cls)
334 return result
335
336 @property
337 def __isabstractmethod__(self):
338 return getattr(self.func, "__isabstractmethod__", False)
339
Antoine Pitroub5b37142012-11-13 21:35:40 +0100340
341################################################################################
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700342### LRU Cache function decorator
343################################################################################
344
Raymond Hettingerdce583e2012-03-16 22:12:20 -0700345_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])
Nick Coghlan234515a2010-11-30 06:19:46 +0000346
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700347class _HashedSeq(list):
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700348 """ This class guarantees that hash() will be called no more than once
349 per element. This is important because the lru_cache() will hash
350 the key multiple times on a cache miss.
351
352 """
353
Raymond Hettinger9acbb602012-04-30 22:32:16 -0700354 __slots__ = 'hashvalue'
355
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700356 def __init__(self, tup, hash=hash):
357 self[:] = tup
358 self.hashvalue = hash(tup)
Raymond Hettinger9acbb602012-04-30 22:32:16 -0700359
360 def __hash__(self):
361 return self.hashvalue
362
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700363def _make_key(args, kwds, typed,
364 kwd_mark = (object(),),
365 fasttypes = {int, str, frozenset, type(None)},
366 sorted=sorted, tuple=tuple, type=type, len=len):
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700367 """Make a cache key from optionally typed positional and keyword arguments
368
369 The key is constructed in a way that is flat as possible rather than
370 as a nested structure that would take more memory.
371
372 If there is only a single argument and its data type is known to cache
373 its hash value, then that argument is returned without a wrapper. This
374 saves space and improves lookup speed.
375
376 """
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700377 key = args
378 if kwds:
379 sorted_items = sorted(kwds.items())
380 key += kwd_mark
381 for item in sorted_items:
382 key += item
383 if typed:
384 key += tuple(type(v) for v in args)
385 if kwds:
386 key += tuple(type(v) for k, v in sorted_items)
387 elif len(key) == 1 and type(key[0]) in fasttypes:
388 return key[0]
389 return _HashedSeq(key)
390
Raymond Hettinger010ce322012-05-19 21:20:48 -0700391def lru_cache(maxsize=128, typed=False):
Benjamin Peterson1f594ad2010-08-08 13:17:07 +0000392 """Least-recently-used cache decorator.
Georg Brandl2e7346a2010-07-31 18:09:23 +0000393
Raymond Hettingerc79fb0e2010-12-01 03:45:41 +0000394 If *maxsize* is set to None, the LRU features are disabled and the cache
395 can grow without bound.
396
Raymond Hettingercd9fdfd2011-10-20 08:57:45 -0700397 If *typed* is True, arguments of different types will be cached separately.
398 For example, f(3.0) and f(3) will be treated as distinct calls with
399 distinct results.
400
Georg Brandl2e7346a2010-07-31 18:09:23 +0000401 Arguments to the cached function must be hashable.
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000402
Raymond Hettinger7f7a5a72012-03-30 21:50:40 -0700403 View the cache statistics named tuple (hits, misses, maxsize, currsize)
404 with f.cache_info(). Clear the cache and statistics with f.cache_clear().
Raymond Hettinger00f2f972010-12-01 00:47:56 +0000405 Access the underlying function with f.__wrapped__.
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000406
407 See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used
Georg Brandl2e7346a2010-07-31 18:09:23 +0000408
Benjamin Peterson1f594ad2010-08-08 13:17:07 +0000409 """
Raymond Hettinger1ff50df2012-03-30 13:15:48 -0700410
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000411 # Users should only access the lru_cache through its public API:
Raymond Hettinger5e20bab2010-11-30 07:13:04 +0000412 # cache_info, cache_clear, and f.__wrapped__
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000413 # The internals of the lru_cache are encapsulated for thread safety and
414 # to allow the implementation to change (including a possible C version).
415
Raymond Hettinger4d588972014-08-12 12:44:52 -0700416 # Early detection of an erroneous call to @lru_cache without any arguments
417 # resulting in the inner function being passed to maxsize instead of an
418 # integer or None.
419 if maxsize is not None and not isinstance(maxsize, int):
420 raise TypeError('Expected maxsize to be an integer or None')
421
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300422 def decorating_function(user_function):
423 wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo)
424 return update_wrapper(wrapper, user_function)
425
426 return decorating_function
427
428def _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo):
Raymond Hettinger9f0ab9f2012-04-29 14:55:27 -0700429 # Constants shared by all lru cache instances:
Raymond Hettingerb6b98c02012-04-29 18:09:02 -0700430 sentinel = object() # unique object used to signal cache misses
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700431 make_key = _make_key # build a key from the function arguments
Raymond Hettinger9f0ab9f2012-04-29 14:55:27 -0700432 PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields
433
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300434 cache = {}
435 hits = misses = 0
436 full = False
437 cache_get = cache.get # bound method to lookup a key or return None
438 lock = RLock() # because linkedlist updates aren't threadsafe
439 root = [] # root of the circular doubly linked list
440 root[:] = [root, root, None, None] # initialize by pointing to self
Raymond Hettinger6e8c8172012-03-16 16:53:05 -0700441
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300442 if maxsize == 0:
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700443
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300444 def wrapper(*args, **kwds):
445 # No caching -- just a statistics update after a successful call
446 nonlocal misses
447 result = user_function(*args, **kwds)
448 misses += 1
449 return result
450
451 elif maxsize is None:
452
453 def wrapper(*args, **kwds):
454 # Simple caching without ordering or size limit
455 nonlocal hits, misses
456 key = make_key(args, kwds, typed)
457 result = cache_get(key, sentinel)
458 if result is not sentinel:
459 hits += 1
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700460 return result
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300461 result = user_function(*args, **kwds)
462 cache[key] = result
463 misses += 1
464 return result
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700465
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300466 else:
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700467
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300468 def wrapper(*args, **kwds):
469 # Size limited caching that tracks accesses by recency
470 nonlocal root, hits, misses, full
471 key = make_key(args, kwds, typed)
472 with lock:
473 link = cache_get(key)
474 if link is not None:
475 # Move the link to the front of the circular queue
476 link_prev, link_next, _key, result = link
477 link_prev[NEXT] = link_next
478 link_next[PREV] = link_prev
479 last = root[PREV]
480 last[NEXT] = root[PREV] = link
481 link[PREV] = last
482 link[NEXT] = root
Nick Coghlan234515a2010-11-30 06:19:46 +0000483 hits += 1
Raymond Hettinger4b779b32011-10-15 23:50:42 -0700484 return result
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300485 result = user_function(*args, **kwds)
486 with lock:
487 if key in cache:
488 # Getting here means that this same key was added to the
489 # cache while the lock was released. Since the link
490 # update is already done, we need only return the
491 # computed result and update the count of misses.
492 pass
493 elif full:
494 # Use the old root to store the new key and result.
495 oldroot = root
496 oldroot[KEY] = key
497 oldroot[RESULT] = result
498 # Empty the oldest link and make it the new root.
499 # Keep a reference to the old key and old result to
500 # prevent their ref counts from going to zero during the
501 # update. That will prevent potentially arbitrary object
502 # clean-up code (i.e. __del__) from running while we're
503 # still adjusting the links.
504 root = oldroot[NEXT]
505 oldkey = root[KEY]
506 oldresult = root[RESULT]
507 root[KEY] = root[RESULT] = None
508 # Now update the cache dictionary.
509 del cache[oldkey]
510 # Save the potentially reentrant cache[key] assignment
511 # for last, after the root and links have been put in
512 # a consistent state.
513 cache[key] = oldroot
514 else:
515 # Put result in a new link at the front of the queue.
516 last = root[PREV]
517 link = [last, root, key, result]
518 last[NEXT] = root[PREV] = cache[key] = link
Raymond Hettingeraf56e0e2016-12-16 13:57:40 -0800519 # Use the __len__() method instead of the len() function
520 # which could potentially be wrapped in an lru_cache itself.
521 full = (cache.__len__() >= maxsize)
Raymond Hettinger4b779b32011-10-15 23:50:42 -0700522 misses += 1
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300523 return result
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700524
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300525 def cache_info():
526 """Report cache statistics"""
527 with lock:
Raymond Hettingeraf56e0e2016-12-16 13:57:40 -0800528 return _CacheInfo(hits, misses, maxsize, cache.__len__())
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700529
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300530 def cache_clear():
531 """Clear the cache and cache statistics"""
532 nonlocal hits, misses, full
533 with lock:
534 cache.clear()
535 root[:] = [root, root, None, None]
536 hits = misses = 0
537 full = False
Georg Brandl2e7346a2010-07-31 18:09:23 +0000538
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300539 wrapper.cache_info = cache_info
540 wrapper.cache_clear = cache_clear
Serhiy Storchakace2295d2015-10-24 09:51:53 +0300541 return wrapper
Nick Coghlan234515a2010-11-30 06:19:46 +0000542
Serhiy Storchaka46c56112015-05-24 21:53:49 +0300543try:
544 from _functools import _lru_cache_wrapper
545except ImportError:
546 pass
Łukasz Langa6f692512013-06-05 12:20:24 +0200547
548
549################################################################################
550### singledispatch() - single-dispatch generic function decorator
551################################################################################
552
Łukasz Langa3720c772013-07-01 16:00:38 +0200553def _c3_merge(sequences):
554 """Merges MROs in *sequences* to a single MRO using the C3 algorithm.
555
556 Adapted from http://www.python.org/download/releases/2.3/mro/.
557
558 """
559 result = []
560 while True:
561 sequences = [s for s in sequences if s] # purge empty sequences
562 if not sequences:
563 return result
564 for s1 in sequences: # find merge candidates among seq heads
565 candidate = s1[0]
566 for s2 in sequences:
567 if candidate in s2[1:]:
568 candidate = None
569 break # reject the current head, it appears later
570 else:
571 break
Yury Selivanov77a8cd62015-08-18 14:20:00 -0400572 if candidate is None:
Łukasz Langa3720c772013-07-01 16:00:38 +0200573 raise RuntimeError("Inconsistent hierarchy")
574 result.append(candidate)
575 # remove the chosen candidate
576 for seq in sequences:
577 if seq[0] == candidate:
578 del seq[0]
579
580def _c3_mro(cls, abcs=None):
581 """Computes the method resolution order using extended C3 linearization.
582
583 If no *abcs* are given, the algorithm works exactly like the built-in C3
584 linearization used for method resolution.
585
586 If given, *abcs* is a list of abstract base classes that should be inserted
587 into the resulting MRO. Unrelated ABCs are ignored and don't end up in the
588 result. The algorithm inserts ABCs where their functionality is introduced,
589 i.e. issubclass(cls, abc) returns True for the class itself but returns
590 False for all its direct base classes. Implicit ABCs for a given class
591 (either registered or inferred from the presence of a special method like
592 __len__) are inserted directly after the last ABC explicitly listed in the
593 MRO of said class. If two implicit ABCs end up next to each other in the
594 resulting MRO, their ordering depends on the order of types in *abcs*.
595
596 """
597 for i, base in enumerate(reversed(cls.__bases__)):
598 if hasattr(base, '__abstractmethods__'):
599 boundary = len(cls.__bases__) - i
600 break # Bases up to the last explicit ABC are considered first.
601 else:
602 boundary = 0
603 abcs = list(abcs) if abcs else []
604 explicit_bases = list(cls.__bases__[:boundary])
605 abstract_bases = []
606 other_bases = list(cls.__bases__[boundary:])
607 for base in abcs:
608 if issubclass(cls, base) and not any(
609 issubclass(b, base) for b in cls.__bases__
610 ):
611 # If *cls* is the class that introduces behaviour described by
612 # an ABC *base*, insert said ABC to its MRO.
613 abstract_bases.append(base)
614 for base in abstract_bases:
615 abcs.remove(base)
616 explicit_c3_mros = [_c3_mro(base, abcs=abcs) for base in explicit_bases]
617 abstract_c3_mros = [_c3_mro(base, abcs=abcs) for base in abstract_bases]
618 other_c3_mros = [_c3_mro(base, abcs=abcs) for base in other_bases]
619 return _c3_merge(
620 [[cls]] +
621 explicit_c3_mros + abstract_c3_mros + other_c3_mros +
622 [explicit_bases] + [abstract_bases] + [other_bases]
623 )
624
625def _compose_mro(cls, types):
626 """Calculates the method resolution order for a given class *cls*.
627
628 Includes relevant abstract base classes (with their respective bases) from
629 the *types* iterable. Uses a modified C3 linearization algorithm.
Łukasz Langa6f692512013-06-05 12:20:24 +0200630
631 """
632 bases = set(cls.__mro__)
Łukasz Langa3720c772013-07-01 16:00:38 +0200633 # Remove entries which are already present in the __mro__ or unrelated.
634 def is_related(typ):
635 return (typ not in bases and hasattr(typ, '__mro__')
636 and issubclass(cls, typ))
637 types = [n for n in types if is_related(n)]
638 # Remove entries which are strict bases of other entries (they will end up
639 # in the MRO anyway.
640 def is_strict_base(typ):
641 for other in types:
642 if typ != other and typ in other.__mro__:
643 return True
644 return False
645 types = [n for n in types if not is_strict_base(n)]
646 # Subclasses of the ABCs in *types* which are also implemented by
647 # *cls* can be used to stabilize ABC ordering.
648 type_set = set(types)
649 mro = []
650 for typ in types:
651 found = []
652 for sub in typ.__subclasses__():
653 if sub not in bases and issubclass(cls, sub):
654 found.append([s for s in sub.__mro__ if s in type_set])
655 if not found:
656 mro.append(typ)
657 continue
658 # Favor subclasses with the biggest number of useful bases
659 found.sort(key=len, reverse=True)
660 for sub in found:
661 for subcls in sub:
662 if subcls not in mro:
663 mro.append(subcls)
664 return _c3_mro(cls, abcs=mro)
Łukasz Langa6f692512013-06-05 12:20:24 +0200665
666def _find_impl(cls, registry):
Łukasz Langa3720c772013-07-01 16:00:38 +0200667 """Returns the best matching implementation from *registry* for type *cls*.
Łukasz Langa6f692512013-06-05 12:20:24 +0200668
Łukasz Langa3720c772013-07-01 16:00:38 +0200669 Where there is no registered implementation for a specific type, its method
670 resolution order is used to find a more generic implementation.
671
672 Note: if *registry* does not contain an implementation for the base
673 *object* type, this function may return None.
Łukasz Langa6f692512013-06-05 12:20:24 +0200674
675 """
676 mro = _compose_mro(cls, registry.keys())
677 match = None
678 for t in mro:
679 if match is not None:
Łukasz Langa3720c772013-07-01 16:00:38 +0200680 # If *match* is an implicit ABC but there is another unrelated,
681 # equally matching implicit ABC, refuse the temptation to guess.
682 if (t in registry and t not in cls.__mro__
683 and match not in cls.__mro__
684 and not issubclass(match, t)):
Łukasz Langa6f692512013-06-05 12:20:24 +0200685 raise RuntimeError("Ambiguous dispatch: {} or {}".format(
686 match, t))
687 break
688 if t in registry:
689 match = t
690 return registry.get(match)
691
692def singledispatch(func):
693 """Single-dispatch generic function decorator.
694
695 Transforms a function into a generic function, which can have different
696 behaviours depending upon the type of its first argument. The decorated
697 function acts as the default implementation, and additional
Łukasz Langa3720c772013-07-01 16:00:38 +0200698 implementations can be registered using the register() attribute of the
699 generic function.
Łukasz Langa6f692512013-06-05 12:20:24 +0200700
701 """
702 registry = {}
703 dispatch_cache = WeakKeyDictionary()
704 cache_token = None
705
Łukasz Langa3720c772013-07-01 16:00:38 +0200706 def dispatch(cls):
707 """generic_func.dispatch(cls) -> <function implementation>
Łukasz Langa6f692512013-06-05 12:20:24 +0200708
709 Runs the dispatch algorithm to return the best available implementation
Łukasz Langa3720c772013-07-01 16:00:38 +0200710 for the given *cls* registered on *generic_func*.
Łukasz Langa6f692512013-06-05 12:20:24 +0200711
712 """
713 nonlocal cache_token
714 if cache_token is not None:
715 current_token = get_cache_token()
716 if cache_token != current_token:
717 dispatch_cache.clear()
718 cache_token = current_token
719 try:
Łukasz Langa3720c772013-07-01 16:00:38 +0200720 impl = dispatch_cache[cls]
Łukasz Langa6f692512013-06-05 12:20:24 +0200721 except KeyError:
722 try:
Łukasz Langa3720c772013-07-01 16:00:38 +0200723 impl = registry[cls]
Łukasz Langa6f692512013-06-05 12:20:24 +0200724 except KeyError:
Łukasz Langa3720c772013-07-01 16:00:38 +0200725 impl = _find_impl(cls, registry)
726 dispatch_cache[cls] = impl
Łukasz Langa6f692512013-06-05 12:20:24 +0200727 return impl
728
Łukasz Langa3720c772013-07-01 16:00:38 +0200729 def register(cls, func=None):
730 """generic_func.register(cls, func) -> func
Łukasz Langa6f692512013-06-05 12:20:24 +0200731
Łukasz Langa3720c772013-07-01 16:00:38 +0200732 Registers a new implementation for the given *cls* on a *generic_func*.
Łukasz Langa6f692512013-06-05 12:20:24 +0200733
734 """
735 nonlocal cache_token
736 if func is None:
Łukasz Langa3720c772013-07-01 16:00:38 +0200737 return lambda f: register(cls, f)
738 registry[cls] = func
739 if cache_token is None and hasattr(cls, '__abstractmethods__'):
Łukasz Langa6f692512013-06-05 12:20:24 +0200740 cache_token = get_cache_token()
741 dispatch_cache.clear()
742 return func
743
744 def wrapper(*args, **kw):
745 return dispatch(args[0].__class__)(*args, **kw)
746
747 registry[object] = func
748 wrapper.register = register
749 wrapper.dispatch = dispatch
750 wrapper.registry = MappingProxyType(registry)
751 wrapper._clear_cache = dispatch_cache.clear
752 update_wrapper(wrapper, func)
753 return wrapper