Написать декоратор, который считает количество вызовов функции и выводит

Храните общий счётчик для всех декорированных функций. При каждом вызове увеличивайте его, выбирайте лидера и печатайте имена лидера и текущей функции.

Короткий ответ

Что ответить на собеседовании

Храните общий счётчик для всех декорированных функций. При каждом вызове увеличивайте его, выбирайте лидера и печатайте имена лидера и текущей функции.

Подробный разбор

Ответ с пояснениями

Условие

Написать декоратор, который считает количество вызовов функции и выводит

название функции первого места по количеству и текущую функцию

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

Вариант рассчитан на синхронное однопоточное использование. Для конкурентных вызовов обновление статистики и определение лидера защищают общей блокировкой.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее