[имя] спросил: Можно ли обратиться к wrapper.calls как после определения функции def wrapper, так и внутри самого тела wrapper?

К атрибуту wrapper.calls можно обращаться после определения функции и внутри её тела, если атрибут уже создан к моменту чтения. Функция — объект, которому можно присваивать атрибуты.

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

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

К атрибуту wrapper.calls можно обращаться после определения функции и внутри её тела, если атрибут уже создан к моменту чтения. Функция — объект, которому можно присваивать атрибуты.

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

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

К атрибуту wrapper.calls можно обращаться после определения функции и внутри её тела, если атрибут уже создан к моменту чтения. Функция — объект, которому можно присваивать атрибуты.

def wrapper(*args, **kwargs):
    wrapper.calls += 1
    return args, kwargs

wrapper.calls = 0
wrapper('test')
print(wrapper.calls)  # 1

Тело выполняется при вызове, поэтому присваивание после def успевает создать атрибут. Без инициализации чтение даст AttributeError. Счётчик общий для этого объекта функции; при конкурентных вызовах и переопределении имени wrapper нужны дополнительные меры.

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

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

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

Подробнее