You are overwriting fib and then f calls fib instead of itself:
def fib(n):
if n==1 or n==0:
return n
else:
print("fib is: " + repr(fib))
return fib(n-1) + fib(n-2)
def decor(f):
def counted(*args):
counted.call_count += 1
return f(*args)
counted.call_count = 0
return counted
f = decor(fib)
fib = decor(fib)
print("=== f ===")
print(f(6))
print(f.call_count)
print("=== fib ===")
print(fib(6))
print(fib.call_count)
When I run this the output is:
=== f ===
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
8
1
=== fib ===
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
8
49
Note that fib is function at 0x7fa844639758 all the time.