Dekorieren von rekursiven Funktionen in Python

Es fällt mir schwer zu verstehen, wie eine dekorierte rekursive Funktion funktioniert. Für das folgende Snippet:

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

Die Ausgabe ist:

(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

Das erste gibt f (n) aus, so dass es natürlich jedes Mal 'Original' ausgibt, wenn f (n) rekursiv aufgerufen wird.

Der zweite Befehl gibt def_f (n) aus. Wenn also n an den Wrapper übergeben wird, wird f (n) rekursiv aufgerufen. Der Wrapper selbst ist jedoch nicht rekursiv, sodass nur ein 'Dekoriert' gedruckt wird.

Der dritte verwirrt mich, was dasselbe ist, als wenn man den Dekorateur @dec benutzt. Warum ruft decorated f (n) den Wrapper auch fünfmal auf? Es scheint mir, dass def_f = dec (f) und f = dec (f) nur zwei Schlüsselwörter sind, die an zwei identische Funktionsobjekte gebunden sind. Ist noch etwas los, wenn die dekorierte Funktion den gleichen Namen hat wie die nicht dekorierte?

Vielen Dank!

Antworten auf die Frage(5)

Ihre Antwort auf die Frage