Я хотел бы сделать декоратор Python, который запоминает функции. Например, если
@memoization_decorator
def add(a, b, negative=False):
print "Computing"
return (a + b) * (1 if negative is False else -1)
add(1, 2)
add(1, b=2)
add(1, 2, negative=False)
add(1, b=2, negative=False)
add(a=1, b=2, negative=False)
add(a=1, b=2)
Я хотел бы, чтобы вывод был
Computing
3
3
3
3
3
3
и вывод должен быть одинаковым при любой перестановке последних 6 строк.
Это сводится к поиску карты, отправляющей эквивалентные наборы *args, **kwargs**
на уникальный ключ для кэша мемоизации dict
. В приведенном выше примере *args, **kwargs
равно
(1, 2), {}
(1,), {'b': 2}
(1, 2), {'negative': False}
(1,), {'b': 2, 'negative': False}
(), {'a': 1, 'b': 2, 'negative': False}
(), {'a': 1, 'b': 2}
add(1,2)
иadd(1, 2, negative=False)
даетComputing \\ 3
оба раза, поэтому второй вызов вычисляется, а не возвращается из кэша. 21.04.2016**kwargs
в дополнение к обычным аргументам. 16.06.2016inspect.getargspec
устарел, начиная с версии 3.0: используйтеgetfullargspec()
для обновленного API, который обычно является заменой, но также правильно обрабатывает аннотации функций и параметры, содержащие только ключевые слова. 18.08.2020