Я видел в сети код, подсчитывающий количество вызовов функции с помощью декораторов. Ниже приведен код:
import functools
def count_calls(func):
@functools.wraps(func)
def wrapper_count_calls(*args, **kwargs):
wrapper_count_calls.num_calls += 1
print(f"Call {wrapper_count_calls.num_calls} of {func.__name__!r}")
return func(*args, **kwargs)
wrapper_count_calls.num_calls = 0
return wrapper_count_calls
@count_calls
def say_whee():
print("Whee!")
@count_calls
def say_whoo():
print("Whoo!")
say_whee()
say_whee()
say_whee()
say_whoo()
say_whoo()
say_whoo()
Вывод приведенного выше кода:
Call 1 of 'say_whee'
Whee!
Call 2 of 'say_whee'
Whee!
Call 3 of 'say_whee'
Whee!
Call 1 of 'say_whoo'
Whoo!
Call 2 of 'say_whoo'
Whoo!
Call 3 of 'say_whoo'
Whoo!
Но атрибут функции "wrapper_count_calls.num_calls" является общим для функций "say_whee" и "say_whoo". Тогда почему счетчик сбрасывается? Разве это не должно начинаться с 4 для say_whoo?