Подтвердить что ты не робот

Почему нужна строка в этой функции 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 (если предположить, что это не неудобное совпадение)?

Спасибо!

4b9b3361

Ответ 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}