Я хотел бы сделать декоратор python, который запоминает функции. Например, еслиMemoization/Caching с необязательными аргументами по умолчанию
@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**
к уникальному ключу для кеша memoization 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'' оба раза, поэтому вычисляется второй вызов а не возвращаться из кеша. –
@JonWarneke: Я понимаю, что вы имеете в виду. Я расширил свой ответ, включив в него полное решение. –
Это, кажется, сломано для функции, которая принимает '** kwargs' в дополнение к регулярным аргументам. – ThiefMaster