Решение, которое работает как с аргументами positional, так и с ключевыми словами независимо от порядка, в котором были переданы ключевые слова args (используя inspect.getargspec ):
import inspect
import functools
def memoize(fn):
cache = fn.cache = {}
@functools.wraps(fn)
def memoizer(*args, **kwargs):
kwargs.update(dict(zip(inspect.getargspec(fn).args, args)))
key = tuple(kwargs.get(k, None) for k in inspect.getargspec(fn).args)
if key not in cache:
cache[key] = fn(**kwargs)
return cache[key]
return memoizer
Аналогичный вопрос: Идентификация эквивалентных функций функции varargs для memoization в Python