Храните общий счётчик для всех декорированных функций. При каждом вызове увеличивайте его, выбирайте лидера и печатайте имена лидера и текущей функции.
Написать декоратор, который считает количество вызовов функции и выводит
Храните общий счётчик для всех декорированных функций. При каждом вызове увеличивайте его, выбирайте лидера и печатайте имена лидера и текущей функции.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Написать декоратор, который считает количество вызовов функции и выводит
название функции первого места по количеству и текущую функцию
def call_count(): ...
Ответ
Храните общий счётчик для всех декорированных функций. При каждом вызове увеличивайте его, выбирайте лидера и печатайте имена лидера и текущей функции.
Один экземпляр декоратора объединяет статистику нескольких функций. Здесь считаются попытки вызова, включая завершившиеся исключением; при равенстве побеждает функция, зарегистрированная раньше.
from functools import wraps
def call_count():
counts = {}
def decorate(fn):
counts[fn] = 0
@wraps(fn)
def wrapped(*args, **kwargs):
counts[fn] += 1
leader = max(counts, key=counts.get)
print(leader.__qualname__, fn.__qualname__)
return fn(*args, **kwargs)
return wrapped
return decorate
counted = call_count()
@counted
def first():
return 1
@counted
def second():
return 2
Вариант рассчитан на синхронное однопоточное использование. Для конкурентных вызовов обновление статистики и определение лидера защищают общей блокировкой.