Дайте обёртке явный метод чтения счётчика, замкнутый на ту же nonlocal-переменную. Не нужно искать значение по индексам внутренних ячеек closure.
[имя] спросил: Если информация о количестве вызовов хранится в замыкании через nonlocal, как узнать снаружи, сколько раз была вызвана конкретная функция (например, a)?
Дайте обёртке явный метод чтения счётчика, замкнутый на ту же 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(). Счётчик отдельный для каждой декорированной функции и учитывает попытки, включая вызовы с ошибкой. Для нескольких потоков или процессов потребуется отдельный контракт синхронизации и хранения.