Decorando funções recursivas em python

Eu estou tendo dificuldade em entender como funciona uma função recursiva decorada. Para o seguinte trecho:

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))

A saída é:

(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

O primeiro imprime f (n), então naturalmente ele imprime 'Original' toda vez que f (n) é chamado recursivamente.

O segundo imprime def_f (n), então quando n é passado para o wrapper, ele chama f (n) recursivamente. Mas o invólucro em si não é recursivo, então apenas um 'Decorado' é impresso.

O terceiro me intriga, o que é o mesmo que usar decorador @ dec. Por que o f (n) decorado chama o invólucro cinco vezes também? Parece-me que def_f = dec (f) ef = dec (f) são apenas duas palavras-chave ligadas a dois objetos de função idênticos. Há algo mais acontecendo quando a função decorada recebe o mesmo nome que a não decorada?

Obrigado!

questionAnswers(5)

yourAnswerToTheQuestion