[имя] спросил: Если информация о количестве вызовов хранится в замыкании через nonlocal, как узнать снаружи, сколько раз была вызвана конкретная функция (например, a)?

Дайте обёртке явный метод чтения счётчика, замкнутый на ту же nonlocal-переменную. Не нужно искать значение по индексам внутренних ячеек __closure__.

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

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

Дайте обёртке явный метод чтения счётчика, замкнутый на ту же nonlocal-переменную. Не нужно искать значение по индексам внутренних ячеек closure.

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

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

Дайте обёртке явный метод чтения счётчика, замкнутый на ту же nonlocal-переменную. Не нужно искать значение по индексам внутренних ячеек closure.

from functools import wraps

def counted(fn):
    calls = 0
    @wraps(fn)
    def wrapper(*args, **kwargs):
        nonlocal calls
        calls += 1
        return fn(*args, **kwargs)
    wrapper.get_calls = lambda: calls
    return wrapper

После a = counted(a) значение доступно через a.get_calls(). Счётчик отдельный для каждой декорированной функции и учитывает попытки, включая вызовы с ошибкой. Для нескольких потоков или процессов потребуется отдельный контракт синхронизации и хранения.

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

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

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

Подробнее