Как подсчитать количество вызова функции 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
→ Ссылка