К атрибуту wrapper.calls можно обращаться после определения функции и внутри её тела, если атрибут уже создан к моменту чтения. Функция — объект, которому можно присваивать атрибуты.
[имя] спросил: Можно ли обратиться к wrapper.calls как после определения функции def wrapper, так и внутри самого тела wrapper?
К атрибуту 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 нужны дополнительные меры.