Почему нужна строка в этой функции python? (памятная рекурсия)
Я получил следующий фрагмент кода с сайта Peter Norvig; это декоратор для включения memoization в вызовы функций (кэширование предыдущих вызовов функции для изменения экспоненциальной рекурсии в простую динамическую программу).
def memo(f):
table = {}
def fmemo(*args):
if args not in table:
table[args] = f(*args)
return table[args]
fmemo.memo = table
return fmemo
Код работает нормально, но мне интересно, почему нужна вторая в последнюю строку. Очевидно, это пробел в моем знании Python, но, удалив строку и запустив простую функцию фибоначчи, она все еще работает. Это связано с одновременным воспоминанием нескольких функций? Почему переменная-член fmemo будет называться memo (если предположить, что это не неудобное совпадение)?
Спасибо!
Ответы
Ответ 1
Так как функции являются объектами, как и все остальное, вы можете установить на них атрибуты. См:
>>> def foo(): pass
>>> foo.x = 1
>>> foo.x
1
Вторая строка устанавливает внутренний кеш значений как атрибут объекта функции, тем самым раскрывая его. Это означает, что вы можете взять memoised функцию и скрипку с ее кешем, как вы, без необходимости его вызова. Это может быть удобно.
Пример:
>>> @memo
... def id(x): return x
>>> id(1)
1
>>> id(2)
2
>>> id.memo
{(2,): 2, (1,): 1}