Как подсчитать количество вызова функции Python
Как подсчитать количество вызова функции и как вывести. Как это сделать с помощью декоратора и как с помощью логирования, если это возможно и какие есть еще способы.
Важно: Без внешнего кода и глобальных переменных.
Ответы (4 шт):
Автор решения: Victor VosMottor
→ Ссылка
counter = 0
def your_f():
global counter
counter += 1
# now do your stuff
...
print(counter) # how many your_f was called
OR
def your_f():
your_f.counter += 1
your_f.counter = 0
for i in range(3):
your_f()
print(your_f.counter)
OR
class CountFunction():
def __init__(self, function):
self.function = function
self.counter = 0
def define(self, function):
'''
Defines a function. Use external function or lambda.
'''
self.function = function
def count(self):
'''
Returns how many it was called
'''
return self.counter
def reset(self):
'''
Resets counter
'''
self.counter = 0
def __call__(self, *args, **kwargs):
'''Call'''
self.counter += 1
return self.function(*args, **kwargs)
Автор решения: eri
→ Ссылка
Вот таким декоратором делаем иньекцию переменной счётчика в функцию:
def counter(fu):
def inner(*a,**kw):
inner.count+=1
return fu(*a,**kw)
inner.count = 0
return inner
@counter
def test():
pass
@counter
def test1():
print(test1.count)
test()
test()
test1()
test1()
test1()
print(test.count)
print(test1.count)
Внутри функции этот счётчик доступен.
Автор решения: CrazyElf
→ Ссылка
Пример с декоратором:
def count(func):
"""
Декоратор - счётчик
"""
counters = {}
def wrapper(*args, **kwargs):
counters[func] = counters.get(func, 0) + 1
print(f'Функция {func.__name__} вызвана {counters[func]} раз')
return func(*args, **kwargs)
return wrapper
@count
def double_function(a):
"""
Умножаем полученный параметр.
"""
return a*2
@count
def triple_function(a):
"""
Утраиваем
"""
return a*3
if __name__ == "__main__":
print(list(map(double_function, range(2))))
print(list(map(triple_function, range(4))))
print(list(map(double_function, range(10,11))))
print(list(map(triple_function, range(12,13))))
Вывод:
Функция double_function вызвана 1 раз
Функция double_function вызвана 2 раз
[0, 2]
Функция triple_function вызвана 1 раз
Функция triple_function вызвана 2 раз
Функция triple_function вызвана 3 раз
Функция triple_function вызвана 4 раз
[0, 3, 6, 9]
Функция double_function вызвана 3 раз
[20]
Функция triple_function вызвана 5 раз
[36]
Автор решения: Tema
→ Ссылка
Самый простой вариант:
def counter(func):
"""Декоратор считает количество вызовов функции"""
def inner():
inner.count += 1
func()
inner.count = 0
return inner