Die folgenden Memoize-Dekoratoren werden in Pythonwiki vorgestellt.
# note that this decorator ignores **kwargs
def memoize(obj):
    cache = obj.cache = {}
    @functools.wraps(obj)
    def memoizer(*args, **kwargs):
        if args not in cache:
            cache[args] = obj(*args, **kwargs)
        return cache[args]
    return memoizer
Wie im Kommentar angegeben, scheint es jedoch, dass kwargs nicht unterstützt werden. Lass uns damit umgehen.
# do not use "self" for a name of argument.
import inspect
def memoize(obj):
    cache = obj.cache = {}
    @functools.wraps(obj)
    def memoizer(*args, **kwargs):
        argdict = inspect.getcallargs(obj, *args, **kwargs)
        argdict.pop('self', None) # if obj is a bound method, arguments includes "self"
        argset = frozenset(argdict.iteritems()) # for Python3, use dict.items() instead
        if argset not in cache:
            cache[argset] = obj(*args, **kwargs)
        return cache[argset]
    return memoizer
Der Punkt ist, die Standardbibliotheksinspektion zu verwenden. inspect.getcallargs ()
>>> def f(a, b, c=10):
...     pass
... 
>>> inspect.getcallargs(f, 1, 2) 
{'a': 1, 'c': 10, 'b': 2}
So macht es den Namen des Arguments und das Argument in ein Wörterbuch. inspizieren ist in vielerlei Hinsicht nützlich.
Recommended Posts