Что выведет код Middle Декораторы обновлено

Когда печатает декоратор

Вопрос

Что выведет код? По строке на каждый print.

def register(fn):
    print('register', fn.__name__)
    def wrapper():
        print('call', fn.__name__)
        return fn()
    return wrapper

@register
def ping():
    return 'pong'

print('ready')
print(ping())
print(ping.__name__)

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: register ping, ready, call ping, pong, wrapper. Декоратор выполняется сразу при определении ping, поэтому register ping идёт раньше ready.

Что выведет

register ping
ready
call ping
pong
wrapper

Разбор

Декоратор выполняется сразу при определении ping, поэтому register ping идёт раньше ready. Вызов ping() запускает обёртку: call ping, затем результат pong. Без functools.wraps имя функции стало wrapper.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.