Decorando funciones recursivas en python.

Me cuesta entender cómo funciona una función recursiva decorada. Para el siguiente fragmento de código:

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

La salida es:

(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

El primero imprime f (n), así que naturalmente imprime 'Original' cada vez que se llama a f (n) de forma recursiva.

El segundo imprime def_f (n), por lo que cuando se pasa n al envoltorio, se llama f (n) recursivamente. Pero la envoltura en sí no es recursiva, por lo que solo se imprime un 'Decorado'.

El tercero me desconcierta, que es lo mismo que usar el decorador @dec. ¿Por qué decorado f (n) también llama al envoltorio cinco veces? Me parece que def_f = dec (f) y f = dec (f) son solo dos palabras clave vinculadas a dos objetos de función idénticos. ¿Hay algo más en juego cuando la función decorada recibe el mismo nombre que la no decorada?

¡Gracias!

Respuestas a la pregunta(5)

Su respuesta a la pregunta