Dekorowanie funkcji rekurencyjnych w Pythonie

Trudno mi zrozumieć, jak działa dekorowana funkcja rekurencyjna. Dla następującego fragmentu:

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

Dane wyjściowe to:

(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

Pierwszy drukuje f (n), więc naturalnie drukuje „Oryginał” za każdym razem, gdy f (n) jest wywoływane rekurencyjnie.

Drugi wypisuje def_f (n), więc gdy n jest przekazywane do opakowania, wywołuje f (n) rekurencyjnie. Ale samo opakowanie nie jest rekurencyjne, więc drukowany jest tylko jeden „Dekorowany”.

Trzecia z nich mnie zastanawia, co jest tym samym, co użycie dekoratora @dec. Dlaczego ozdobione f (n) nazywa pięciokrotnie opakowanie? Wygląda na to, że def_f = dec (f) i f = dec (f) to tylko dwa słowa kluczowe powiązane z dwoma identycznymi obiektami funkcyjnymi. Czy dzieje się coś jeszcze, gdy ozdobiona funkcja ma taką samą nazwę jak niezdekorowana?

Dzięki!

questionAnswers(5)

yourAnswerToTheQuestion