blob: 2ae83130f3d77f7d8655abfe08be0065c591c7a9 [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
Raymond Hettingercbe88132010-08-14 22:22:10 +000026except:
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 Hettinger0603d302015-01-05 21:52:10 -080097def _gt_from_lt(self, other):
98 '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 Hettinger0603d302015-01-05 21:52:10 -0800104def _le_from_lt(self, other):
105 '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
109def _ge_from_lt(self, other):
110 '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
116def _ge_from_le(self, other):
117 '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 Hettinger0603d302015-01-05 21:52:10 -0800123def _lt_from_le(self, other):
124 '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 Hettinger0603d302015-01-05 21:52:10 -0800130def _gt_from_le(self, other):
131 '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
137def _lt_from_gt(self, other):
138 '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
144def _ge_from_gt(self, other):
145 '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
149def _le_from_gt(self, other):
150 '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
156def _le_from_ge(self, other):
157 '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
163def _gt_from_ge(self, other):
164 '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
170def _lt_from_ge(self, other):
171 '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
177def total_ordering(cls):
Georg Brandle5a26732010-05-19 21:06:36 +0000178 """Class decorator that fills in missing ordering methods"""
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000179 convert = {
Raymond Hettinger0603d302015-01-05 21:52:10 -0800180 '__lt__': [('__gt__', _gt_from_lt),
181 ('__le__', _le_from_lt),
182 ('__ge__', _ge_from_lt)],
183 '__le__': [('__ge__', _ge_from_le),
184 ('__lt__', _lt_from_le),
185 ('__gt__', _gt_from_le)],
186 '__gt__': [('__lt__', _lt_from_gt),
187 ('__ge__', _ge_from_gt),
188 ('__le__', _le_from_gt)],
189 '__ge__': [('__le__', _le_from_ge),
190 ('__gt__', _gt_from_ge),
191 ('__lt__', _lt_from_ge)]
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000192 }
Raymond Hettinger3255c632010-09-16 00:31:21 +0000193 # Find user-defined comparisons (not those inherited from object).
Raymond Hettinger1006bd42010-09-14 22:55:13 +0000194 roots = [op for op in convert if getattr(cls, op, None) is not getattr(object, op, None)]
Raymond Hettinger56de7e22010-04-10 16:59:03 +0000195 if not roots:
196 raise ValueError('must define at least one ordering operation: < > <= >=')
197 root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000198 for opname, opfunc in convert[root]:
199 if opname not in roots:
200 opfunc.__name__ = opname
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000201 setattr(cls, opname, opfunc)
202 return cls
203
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700204
205################################################################################
206### cmp_to_key() function converter
207################################################################################
208
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000209def cmp_to_key(mycmp):
Georg Brandle5a26732010-05-19 21:06:36 +0000210 """Convert a cmp= function into a key= function"""
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000211 class K(object):
Raymond Hettingera0d1d962011-03-21 17:50:28 -0700212 __slots__ = ['obj']
Raymond Hettinger7ab9e222011-04-05 02:33:54 -0700213 def __init__(self, obj):
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000214 self.obj = obj
215 def __lt__(self, other):
216 return mycmp(self.obj, other.obj) < 0
217 def __gt__(self, other):
218 return mycmp(self.obj, other.obj) > 0
219 def __eq__(self, other):
220 return mycmp(self.obj, other.obj) == 0
221 def __le__(self, other):
222 return mycmp(self.obj, other.obj) <= 0
223 def __ge__(self, other):
224 return mycmp(self.obj, other.obj) >= 0
225 def __ne__(self, other):
226 return mycmp(self.obj, other.obj) != 0
Raymond Hettinger003be522011-05-03 11:01:32 -0700227 __hash__ = None
Raymond Hettingerc50846a2010-04-05 18:56:31 +0000228 return K
Georg Brandl2e7346a2010-07-31 18:09:23 +0000229
Raymond Hettinger7ab9e222011-04-05 02:33:54 -0700230try:
231 from _functools import cmp_to_key
Brett Cannoncd171c82013-07-04 17:43:24 -0400232except ImportError:
Raymond Hettinger7ab9e222011-04-05 02:33:54 -0700233 pass
234
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700235
236################################################################################
Antoine Pitroub5b37142012-11-13 21:35:40 +0100237### partial() argument application
238################################################################################
239
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000240# Purely functional, no descriptor behaviour
Antoine Pitroub5b37142012-11-13 21:35:40 +0100241def partial(func, *args, **keywords):
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000242 """New function with partial application of the given arguments
Antoine Pitroub5b37142012-11-13 21:35:40 +0100243 and keywords.
244 """
245 def newfunc(*fargs, **fkeywords):
246 newkeywords = keywords.copy()
247 newkeywords.update(fkeywords)
248 return func(*(args + fargs), **newkeywords)
249 newfunc.func = func
250 newfunc.args = args
251 newfunc.keywords = keywords
252 return newfunc
253
254try:
255 from _functools import partial
Brett Cannoncd171c82013-07-04 17:43:24 -0400256except ImportError:
Antoine Pitroub5b37142012-11-13 21:35:40 +0100257 pass
258
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000259# Descriptor version
260class partialmethod(object):
261 """Method descriptor with partial application of the given arguments
262 and keywords.
263
264 Supports wrapping existing descriptors and handles non-descriptor
265 callables as instance methods.
266 """
267
268 def __init__(self, func, *args, **keywords):
269 if not callable(func) and not hasattr(func, "__get__"):
270 raise TypeError("{!r} is not callable or a descriptor"
271 .format(func))
272
273 # func could be a descriptor like classmethod which isn't callable,
274 # so we can't inherit from partial (it verifies func is callable)
275 if isinstance(func, partialmethod):
276 # flattening is mandatory in order to place cls/self before all
277 # other arguments
278 # it's also more efficient since only one function will be called
279 self.func = func.func
280 self.args = func.args + args
281 self.keywords = func.keywords.copy()
282 self.keywords.update(keywords)
283 else:
284 self.func = func
285 self.args = args
286 self.keywords = keywords
287
288 def __repr__(self):
289 args = ", ".join(map(repr, self.args))
290 keywords = ", ".join("{}={!r}".format(k, v)
291 for k, v in self.keywords.items())
292 format_string = "{module}.{cls}({func}, {args}, {keywords})"
293 return format_string.format(module=self.__class__.__module__,
Serhiy Storchaka521e5862014-07-22 15:00:37 +0300294 cls=self.__class__.__qualname__,
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000295 func=self.func,
296 args=args,
297 keywords=keywords)
298
299 def _make_unbound_method(self):
300 def _method(*args, **keywords):
301 call_keywords = self.keywords.copy()
302 call_keywords.update(keywords)
303 cls_or_self, *rest = args
304 call_args = (cls_or_self,) + self.args + tuple(rest)
305 return self.func(*call_args, **call_keywords)
306 _method.__isabstractmethod__ = self.__isabstractmethod__
Yury Selivanovda5fe4f2014-01-27 17:28:37 -0500307 _method._partialmethod = self
Nick Coghlanf4cb48a2013-11-03 16:41:46 +1000308 return _method
309
310 def __get__(self, obj, cls):
311 get = getattr(self.func, "__get__", None)
312 result = None
313 if get is not None:
314 new_func = get(obj, cls)
315 if new_func is not self.func:
316 # Assume __get__ returning something new indicates the
317 # creation of an appropriate callable
318 result = partial(new_func, *self.args, **self.keywords)
319 try:
320 result.__self__ = new_func.__self__
321 except AttributeError:
322 pass
323 if result is None:
324 # If the underlying descriptor didn't do anything, treat this
325 # like an instance method
326 result = self._make_unbound_method().__get__(obj, cls)
327 return result
328
329 @property
330 def __isabstractmethod__(self):
331 return getattr(self.func, "__isabstractmethod__", False)
332
Antoine Pitroub5b37142012-11-13 21:35:40 +0100333
334################################################################################
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700335### LRU Cache function decorator
336################################################################################
337
Raymond Hettingerdce583e2012-03-16 22:12:20 -0700338_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])
Nick Coghlan234515a2010-11-30 06:19:46 +0000339
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700340class _HashedSeq(list):
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700341 """ This class guarantees that hash() will be called no more than once
342 per element. This is important because the lru_cache() will hash
343 the key multiple times on a cache miss.
344
345 """
346
Raymond Hettinger9acbb602012-04-30 22:32:16 -0700347 __slots__ = 'hashvalue'
348
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700349 def __init__(self, tup, hash=hash):
350 self[:] = tup
351 self.hashvalue = hash(tup)
Raymond Hettinger9acbb602012-04-30 22:32:16 -0700352
353 def __hash__(self):
354 return self.hashvalue
355
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700356def _make_key(args, kwds, typed,
357 kwd_mark = (object(),),
358 fasttypes = {int, str, frozenset, type(None)},
359 sorted=sorted, tuple=tuple, type=type, len=len):
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700360 """Make a cache key from optionally typed positional and keyword arguments
361
362 The key is constructed in a way that is flat as possible rather than
363 as a nested structure that would take more memory.
364
365 If there is only a single argument and its data type is known to cache
366 its hash value, then that argument is returned without a wrapper. This
367 saves space and improves lookup speed.
368
369 """
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700370 key = args
371 if kwds:
372 sorted_items = sorted(kwds.items())
373 key += kwd_mark
374 for item in sorted_items:
375 key += item
376 if typed:
377 key += tuple(type(v) for v in args)
378 if kwds:
379 key += tuple(type(v) for k, v in sorted_items)
380 elif len(key) == 1 and type(key[0]) in fasttypes:
381 return key[0]
382 return _HashedSeq(key)
383
Raymond Hettinger010ce322012-05-19 21:20:48 -0700384def lru_cache(maxsize=128, typed=False):
Benjamin Peterson1f594ad2010-08-08 13:17:07 +0000385 """Least-recently-used cache decorator.
Georg Brandl2e7346a2010-07-31 18:09:23 +0000386
Raymond Hettingerc79fb0e2010-12-01 03:45:41 +0000387 If *maxsize* is set to None, the LRU features are disabled and the cache
388 can grow without bound.
389
Raymond Hettingercd9fdfd2011-10-20 08:57:45 -0700390 If *typed* is True, arguments of different types will be cached separately.
391 For example, f(3.0) and f(3) will be treated as distinct calls with
392 distinct results.
393
Georg Brandl2e7346a2010-07-31 18:09:23 +0000394 Arguments to the cached function must be hashable.
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000395
Raymond Hettinger7f7a5a72012-03-30 21:50:40 -0700396 View the cache statistics named tuple (hits, misses, maxsize, currsize)
397 with f.cache_info(). Clear the cache and statistics with f.cache_clear().
Raymond Hettinger00f2f972010-12-01 00:47:56 +0000398 Access the underlying function with f.__wrapped__.
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000399
400 See: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used
Georg Brandl2e7346a2010-07-31 18:09:23 +0000401
Benjamin Peterson1f594ad2010-08-08 13:17:07 +0000402 """
Raymond Hettinger1ff50df2012-03-30 13:15:48 -0700403
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000404 # Users should only access the lru_cache through its public API:
Raymond Hettinger5e20bab2010-11-30 07:13:04 +0000405 # cache_info, cache_clear, and f.__wrapped__
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000406 # The internals of the lru_cache are encapsulated for thread safety and
407 # to allow the implementation to change (including a possible C version).
408
Raymond Hettinger4d588972014-08-12 12:44:52 -0700409 # Early detection of an erroneous call to @lru_cache without any arguments
410 # resulting in the inner function being passed to maxsize instead of an
411 # integer or None.
412 if maxsize is not None and not isinstance(maxsize, int):
413 raise TypeError('Expected maxsize to be an integer or None')
414
Raymond Hettinger9f0ab9f2012-04-29 14:55:27 -0700415 # Constants shared by all lru cache instances:
Raymond Hettingerb6b98c02012-04-29 18:09:02 -0700416 sentinel = object() # unique object used to signal cache misses
Raymond Hettinger0c9050c2012-06-04 00:21:14 -0700417 make_key = _make_key # build a key from the function arguments
Raymond Hettinger9f0ab9f2012-04-29 14:55:27 -0700418 PREV, NEXT, KEY, RESULT = 0, 1, 2, 3 # names for the link fields
419
Raymond Hettinger6e8c8172012-03-16 16:53:05 -0700420 def decorating_function(user_function):
Raymond Hettinger7f7a5a72012-03-30 21:50:40 -0700421 cache = {}
Raymond Hettinger832edde2013-02-17 00:08:45 -0800422 hits = misses = 0
Raymond Hettinger018b4fb2012-04-30 20:48:55 -0700423 full = False
Raymond Hettingerc6897852012-03-31 02:19:06 -0700424 cache_get = cache.get # bound method to lookup a key or return None
Raymond Hettingerfd541172013-03-01 03:47:57 -0800425 lock = RLock() # because linkedlist updates aren't threadsafe
Raymond Hettinger7f7a5a72012-03-30 21:50:40 -0700426 root = [] # root of the circular doubly linked list
427 root[:] = [root, root, None, None] # initialize by pointing to self
Raymond Hettinger6e8c8172012-03-16 16:53:05 -0700428
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700429 if maxsize == 0:
430
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700431 def wrapper(*args, **kwds):
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700432 # No caching -- just a statistics update after a successful call
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700433 nonlocal misses
Raymond Hettinger7dabfed2012-03-17 15:11:09 -0700434 result = user_function(*args, **kwds)
Raymond Hettinger7e0c5812012-03-17 15:10:24 -0700435 misses += 1
436 return result
437
438 elif maxsize is None:
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700439
Raymond Hettingerc79fb0e2010-12-01 03:45:41 +0000440 def wrapper(*args, **kwds):
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700441 # Simple caching without ordering or size limit
Raymond Hettinger832edde2013-02-17 00:08:45 -0800442 nonlocal hits, misses
Raymond Hettinger9acbb602012-04-30 22:32:16 -0700443 key = make_key(args, kwds, typed)
Raymond Hettinger7f7a5a72012-03-30 21:50:40 -0700444 result = cache_get(key, sentinel)
445 if result is not sentinel:
Nick Coghlan234515a2010-11-30 06:19:46 +0000446 hits += 1
Raymond Hettinger4b779b32011-10-15 23:50:42 -0700447 return result
Raymond Hettinger4b779b32011-10-15 23:50:42 -0700448 result = user_function(*args, **kwds)
449 cache[key] = result
450 misses += 1
Raymond Hettingerc79fb0e2010-12-01 03:45:41 +0000451 return result
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700452
Raymond Hettingerc79fb0e2010-12-01 03:45:41 +0000453 else:
Raymond Hettingerbc8e81d2012-03-17 00:24:09 -0700454
Raymond Hettingerc79fb0e2010-12-01 03:45:41 +0000455 def wrapper(*args, **kwds):
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700456 # Size limited caching that tracks accesses by recency
Raymond Hettinger832edde2013-02-17 00:08:45 -0800457 nonlocal root, hits, misses, full
Raymond Hettinger9acbb602012-04-30 22:32:16 -0700458 key = make_key(args, kwds, typed)
Raymond Hettinger4b779b32011-10-15 23:50:42 -0700459 with lock:
Raymond Hettingerec0e9102012-03-16 01:16:31 -0700460 link = cache_get(key)
461 if link is not None:
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700462 # Move the link to the front of the circular queue
463 link_prev, link_next, _key, result = link
Raymond Hettingerec0e9102012-03-16 01:16:31 -0700464 link_prev[NEXT] = link_next
465 link_next[PREV] = link_prev
466 last = root[PREV]
467 last[NEXT] = root[PREV] = link
468 link[PREV] = last
469 link[NEXT] = root
Raymond Hettingerc79fb0e2010-12-01 03:45:41 +0000470 hits += 1
Raymond Hettinger4b779b32011-10-15 23:50:42 -0700471 return result
Raymond Hettinger4b779b32011-10-15 23:50:42 -0700472 result = user_function(*args, **kwds)
473 with lock:
Raymond Hettinger34d94a22012-04-30 14:14:28 -0700474 if key in cache:
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700475 # Getting here means that this same key was added to the
476 # cache while the lock was released. Since the link
Raymond Hettinger34d94a22012-04-30 14:14:28 -0700477 # update is already done, we need only return the
478 # computed result and update the count of misses.
479 pass
Raymond Hettinger018b4fb2012-04-30 20:48:55 -0700480 elif full:
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700481 # Use the old root to store the new key and result.
Raymond Hettingerf2c17a92013-03-04 03:34:09 -0500482 oldroot = root
483 oldroot[KEY] = key
484 oldroot[RESULT] = result
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700485 # Empty the oldest link and make it the new root.
486 # Keep a reference to the old key and old result to
487 # prevent their ref counts from going to zero during the
488 # update. That will prevent potentially arbitrary object
489 # clean-up code (i.e. __del__) from running while we're
490 # still adjusting the links.
Raymond Hettingerf2c17a92013-03-04 03:34:09 -0500491 root = oldroot[NEXT]
492 oldkey = root[KEY]
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700493 oldresult = root[RESULT]
Raymond Hettingerc6897852012-03-31 02:19:06 -0700494 root[KEY] = root[RESULT] = None
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700495 # Now update the cache dictionary.
Raymond Hettingerf2c17a92013-03-04 03:34:09 -0500496 del cache[oldkey]
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700497 # Save the potentially reentrant cache[key] assignment
498 # for last, after the root and links have been put in
499 # a consistent state.
Raymond Hettingerf2c17a92013-03-04 03:34:09 -0500500 cache[key] = oldroot
Raymond Hettinger018b4fb2012-04-30 20:48:55 -0700501 else:
Raymond Hettingerf96b2b02013-03-08 21:11:55 -0700502 # Put result in a new link at the front of the queue.
Raymond Hettinger018b4fb2012-04-30 20:48:55 -0700503 last = root[PREV]
504 link = [last, root, key, result]
Raymond Hettingerf2c17a92013-03-04 03:34:09 -0500505 last[NEXT] = root[PREV] = cache[key] = link
Raymond Hettingerbb5f4802013-03-04 04:20:46 -0500506 full = (len(cache) >= maxsize)
Raymond Hettingerec0e9102012-03-16 01:16:31 -0700507 misses += 1
Raymond Hettingerc79fb0e2010-12-01 03:45:41 +0000508 return result
Georg Brandl2e7346a2010-07-31 18:09:23 +0000509
Nick Coghlan234515a2010-11-30 06:19:46 +0000510 def cache_info():
Raymond Hettinger5e20bab2010-11-30 07:13:04 +0000511 """Report cache statistics"""
Nick Coghlan234515a2010-11-30 06:19:46 +0000512 with lock:
Raymond Hettinger832edde2013-02-17 00:08:45 -0800513 return _CacheInfo(hits, misses, maxsize, len(cache))
Nick Coghlan234515a2010-11-30 06:19:46 +0000514
Raymond Hettinger02566ec2010-09-04 22:46:06 +0000515 def cache_clear():
Benjamin Peterson1f594ad2010-08-08 13:17:07 +0000516 """Clear the cache and cache statistics"""
Raymond Hettinger832edde2013-02-17 00:08:45 -0800517 nonlocal hits, misses, full
Raymond Hettingercbe88132010-08-14 22:22:10 +0000518 with lock:
519 cache.clear()
Benjamin Peterson954cf572012-03-16 18:22:26 -0500520 root[:] = [root, root, None, None]
Raymond Hettinger832edde2013-02-17 00:08:45 -0800521 hits = misses = 0
Raymond Hettinger018b4fb2012-04-30 20:48:55 -0700522 full = False
Georg Brandl2e7346a2010-07-31 18:09:23 +0000523
Nick Coghlan234515a2010-11-30 06:19:46 +0000524 wrapper.cache_info = cache_info
Raymond Hettinger02566ec2010-09-04 22:46:06 +0000525 wrapper.cache_clear = cache_clear
Raymond Hettinger1ff50df2012-03-30 13:15:48 -0700526 return update_wrapper(wrapper, user_function)
Raymond Hettinger5fa40c02010-11-25 08:11:57 +0000527
Georg Brandl2e7346a2010-07-31 18:09:23 +0000528 return decorating_function
Łukasz Langa6f692512013-06-05 12:20:24 +0200529
530
531################################################################################
532### singledispatch() - single-dispatch generic function decorator
533################################################################################
534
Łukasz Langa3720c772013-07-01 16:00:38 +0200535def _c3_merge(sequences):
536 """Merges MROs in *sequences* to a single MRO using the C3 algorithm.
537
538 Adapted from http://www.python.org/download/releases/2.3/mro/.
539
540 """
541 result = []
542 while True:
543 sequences = [s for s in sequences if s] # purge empty sequences
544 if not sequences:
545 return result
546 for s1 in sequences: # find merge candidates among seq heads
547 candidate = s1[0]
548 for s2 in sequences:
549 if candidate in s2[1:]:
550 candidate = None
551 break # reject the current head, it appears later
552 else:
553 break
554 if not candidate:
555 raise RuntimeError("Inconsistent hierarchy")
556 result.append(candidate)
557 # remove the chosen candidate
558 for seq in sequences:
559 if seq[0] == candidate:
560 del seq[0]
561
562def _c3_mro(cls, abcs=None):
563 """Computes the method resolution order using extended C3 linearization.
564
565 If no *abcs* are given, the algorithm works exactly like the built-in C3
566 linearization used for method resolution.
567
568 If given, *abcs* is a list of abstract base classes that should be inserted
569 into the resulting MRO. Unrelated ABCs are ignored and don't end up in the
570 result. The algorithm inserts ABCs where their functionality is introduced,
571 i.e. issubclass(cls, abc) returns True for the class itself but returns
572 False for all its direct base classes. Implicit ABCs for a given class
573 (either registered or inferred from the presence of a special method like
574 __len__) are inserted directly after the last ABC explicitly listed in the
575 MRO of said class. If two implicit ABCs end up next to each other in the
576 resulting MRO, their ordering depends on the order of types in *abcs*.
577
578 """
579 for i, base in enumerate(reversed(cls.__bases__)):
580 if hasattr(base, '__abstractmethods__'):
581 boundary = len(cls.__bases__) - i
582 break # Bases up to the last explicit ABC are considered first.
583 else:
584 boundary = 0
585 abcs = list(abcs) if abcs else []
586 explicit_bases = list(cls.__bases__[:boundary])
587 abstract_bases = []
588 other_bases = list(cls.__bases__[boundary:])
589 for base in abcs:
590 if issubclass(cls, base) and not any(
591 issubclass(b, base) for b in cls.__bases__
592 ):
593 # If *cls* is the class that introduces behaviour described by
594 # an ABC *base*, insert said ABC to its MRO.
595 abstract_bases.append(base)
596 for base in abstract_bases:
597 abcs.remove(base)
598 explicit_c3_mros = [_c3_mro(base, abcs=abcs) for base in explicit_bases]
599 abstract_c3_mros = [_c3_mro(base, abcs=abcs) for base in abstract_bases]
600 other_c3_mros = [_c3_mro(base, abcs=abcs) for base in other_bases]
601 return _c3_merge(
602 [[cls]] +
603 explicit_c3_mros + abstract_c3_mros + other_c3_mros +
604 [explicit_bases] + [abstract_bases] + [other_bases]
605 )
606
607def _compose_mro(cls, types):
608 """Calculates the method resolution order for a given class *cls*.
609
610 Includes relevant abstract base classes (with their respective bases) from
611 the *types* iterable. Uses a modified C3 linearization algorithm.
Łukasz Langa6f692512013-06-05 12:20:24 +0200612
613 """
614 bases = set(cls.__mro__)
Łukasz Langa3720c772013-07-01 16:00:38 +0200615 # Remove entries which are already present in the __mro__ or unrelated.
616 def is_related(typ):
617 return (typ not in bases and hasattr(typ, '__mro__')
618 and issubclass(cls, typ))
619 types = [n for n in types if is_related(n)]
620 # Remove entries which are strict bases of other entries (they will end up
621 # in the MRO anyway.
622 def is_strict_base(typ):
623 for other in types:
624 if typ != other and typ in other.__mro__:
625 return True
626 return False
627 types = [n for n in types if not is_strict_base(n)]
628 # Subclasses of the ABCs in *types* which are also implemented by
629 # *cls* can be used to stabilize ABC ordering.
630 type_set = set(types)
631 mro = []
632 for typ in types:
633 found = []
634 for sub in typ.__subclasses__():
635 if sub not in bases and issubclass(cls, sub):
636 found.append([s for s in sub.__mro__ if s in type_set])
637 if not found:
638 mro.append(typ)
639 continue
640 # Favor subclasses with the biggest number of useful bases
641 found.sort(key=len, reverse=True)
642 for sub in found:
643 for subcls in sub:
644 if subcls not in mro:
645 mro.append(subcls)
646 return _c3_mro(cls, abcs=mro)
Łukasz Langa6f692512013-06-05 12:20:24 +0200647
648def _find_impl(cls, registry):
Łukasz Langa3720c772013-07-01 16:00:38 +0200649 """Returns the best matching implementation from *registry* for type *cls*.
Łukasz Langa6f692512013-06-05 12:20:24 +0200650
Łukasz Langa3720c772013-07-01 16:00:38 +0200651 Where there is no registered implementation for a specific type, its method
652 resolution order is used to find a more generic implementation.
653
654 Note: if *registry* does not contain an implementation for the base
655 *object* type, this function may return None.
Łukasz Langa6f692512013-06-05 12:20:24 +0200656
657 """
658 mro = _compose_mro(cls, registry.keys())
659 match = None
660 for t in mro:
661 if match is not None:
Łukasz Langa3720c772013-07-01 16:00:38 +0200662 # If *match* is an implicit ABC but there is another unrelated,
663 # equally matching implicit ABC, refuse the temptation to guess.
664 if (t in registry and t not in cls.__mro__
665 and match not in cls.__mro__
666 and not issubclass(match, t)):
Łukasz Langa6f692512013-06-05 12:20:24 +0200667 raise RuntimeError("Ambiguous dispatch: {} or {}".format(
668 match, t))
669 break
670 if t in registry:
671 match = t
672 return registry.get(match)
673
674def singledispatch(func):
675 """Single-dispatch generic function decorator.
676
677 Transforms a function into a generic function, which can have different
678 behaviours depending upon the type of its first argument. The decorated
679 function acts as the default implementation, and additional
Łukasz Langa3720c772013-07-01 16:00:38 +0200680 implementations can be registered using the register() attribute of the
681 generic function.
Łukasz Langa6f692512013-06-05 12:20:24 +0200682
683 """
684 registry = {}
685 dispatch_cache = WeakKeyDictionary()
686 cache_token = None
687
Łukasz Langa3720c772013-07-01 16:00:38 +0200688 def dispatch(cls):
689 """generic_func.dispatch(cls) -> <function implementation>
Łukasz Langa6f692512013-06-05 12:20:24 +0200690
691 Runs the dispatch algorithm to return the best available implementation
Łukasz Langa3720c772013-07-01 16:00:38 +0200692 for the given *cls* registered on *generic_func*.
Łukasz Langa6f692512013-06-05 12:20:24 +0200693
694 """
695 nonlocal cache_token
696 if cache_token is not None:
697 current_token = get_cache_token()
698 if cache_token != current_token:
699 dispatch_cache.clear()
700 cache_token = current_token
701 try:
Łukasz Langa3720c772013-07-01 16:00:38 +0200702 impl = dispatch_cache[cls]
Łukasz Langa6f692512013-06-05 12:20:24 +0200703 except KeyError:
704 try:
Łukasz Langa3720c772013-07-01 16:00:38 +0200705 impl = registry[cls]
Łukasz Langa6f692512013-06-05 12:20:24 +0200706 except KeyError:
Łukasz Langa3720c772013-07-01 16:00:38 +0200707 impl = _find_impl(cls, registry)
708 dispatch_cache[cls] = impl
Łukasz Langa6f692512013-06-05 12:20:24 +0200709 return impl
710
Łukasz Langa3720c772013-07-01 16:00:38 +0200711 def register(cls, func=None):
712 """generic_func.register(cls, func) -> func
Łukasz Langa6f692512013-06-05 12:20:24 +0200713
Łukasz Langa3720c772013-07-01 16:00:38 +0200714 Registers a new implementation for the given *cls* on a *generic_func*.
Łukasz Langa6f692512013-06-05 12:20:24 +0200715
716 """
717 nonlocal cache_token
718 if func is None:
Łukasz Langa3720c772013-07-01 16:00:38 +0200719 return lambda f: register(cls, f)
720 registry[cls] = func
721 if cache_token is None and hasattr(cls, '__abstractmethods__'):
Łukasz Langa6f692512013-06-05 12:20:24 +0200722 cache_token = get_cache_token()
723 dispatch_cache.clear()
724 return func
725
726 def wrapper(*args, **kw):
727 return dispatch(args[0].__class__)(*args, **kw)
728
729 registry[object] = func
730 wrapper.register = register
731 wrapper.dispatch = dispatch
732 wrapper.registry = MappingProxyType(registry)
733 wrapper._clear_cache = dispatch_cache.clear
734 update_wrapper(wrapper, func)
735 return wrapper