From a3eabc02e36b0eced7a86fcd2900fa308c2f6bc7 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner <inform@tiker.net> Date: Mon, 26 May 2014 00:16:40 -0500 Subject: [PATCH] Memoize: docs, 2.{4,5} compat, typos --- pytools/__init__.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/pytools/__init__.py b/pytools/__init__.py index 9feae01..6cd3205 100644 --- a/pytools/__init__.py +++ b/pytools/__init__.py @@ -370,14 +370,32 @@ def single_valued(iterable, equality_pred=operator.eq): # {{{ memoization / attribute storage def memoize(*args, **kwargs): + """Stores previously computed function values in a cache. + + Two keyword-only arguments are supported: + + :arg use_kwargs: Allows the caller to use keyword arguments. Defaults to + ``False``. Setting this to ``True`` has a non-negligible performance + impact. + :arg key: A function receiving the same arguments as the decorated function + which computes and returns the cache key. + """ + use_kw = bool(kwargs.pop('use_kwargs', False)) - key_func = kwargs.pop( - 'key', ((lambda *a, **kw: (a, frozenset(kw.iteritems()))) - if use_kw else None)) + + if use_kw: + def default_key_func(*inner_args, **inner_kwargs): + return inner_args, frozenset(inner_kwargs.iteritems()) + else: + default_key_func = None + + key_func = kwargs.pop("key", default_key_func) + if kwargs: raise TypeError( - "memorize recived unexpected keyword arguments: %s" + "memoize received unexpected keyword arguments: %s" % ", ".join(kwargs.keys())) + if key_func is not None: @my_decorator def _deco(func, *args, **kwargs): @@ -416,7 +434,7 @@ def memoize(*args, **kwargs): if callable(args[0]) and len(args) == 1: return _deco(args[0]) raise TypeError( - "memorize recived unexpected position arguments: %s" % args) + "memoize received unexpected position arguments: %s" % args) FunctionValueCache = memoize -- GitLab