Декорирование рекурсивных функций в python

Мне трудно понять, как работает декорированная рекурсивная функция. Для следующего фрагмента:

def dec(f):
    def wrapper(*argv):
        print(argv, 'Decorated!')
        return(f(*argv))
    return(wrapper)

def f(n):
    print(n, 'Original!')
    if n == 1: return(1)
    else: return(f(n - 1) + n)

print(f(5))
print

dec_f = dec(f)
print(dec_f(5))
print

f = dec(f)
print(f(5))

Выход:

(5, 'Original!')
(4, 'Original!')
(3, 'Original!')
(2, 'Original!')
(1, 'Original!')
15

((5,), 'Decorated!')
(5, 'Original!')
(4, 'Original!')
(3, 'Original!')
(2, 'Original!')
(1, 'Original!')
15

((5,), 'Decorated!')
(5, 'Original!')
((4,), 'Decorated!')
(4, 'Original!')
((3,), 'Decorated!')
(3, 'Original!')
((2,), 'Decorated!')
(2, 'Original!')
((1,), 'Decorated!')
(1, 'Original!')
15

Первый из них печатает f (n), поэтому, естественно, он печатает «Оригинал». каждый раз, когда f (n) вызывается рекурсивно.

Второй выводит def_f (n), поэтому, когда n передается в оболочку, он вызывает f (n) рекурсивно. Но сама обертка не является рекурсивной, так что только один «Декорированный» печатается.

Третий меня озадачивает, это то же самое, что и использование декоратора @dec. Почему оформленный f (n) также вызывает обертку пять раз? Мне кажется, что def_f = dec (f) и f = dec (f) - это просто два ключевых слова, связанных с двумя одинаковыми функциональными объектами. Есть ли что-то еще, когда декорированная функция имеет то же имя, что и неокрашенная?

Спасибо!

Ответы на вопрос(5)

Ваш ответ на вопрос