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

Порядок применения и вызова декораторов

Вопрос

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

def tag(name):
    def deco(fn):
        print('apply', name)
        def w():
            return f'<{name}>' + fn() + f'</{name}>'
        return w
    return deco

@tag('b')
@tag('i')
def text():
    return 'hi'

print(text())

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

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

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

Коротко

Код выведет: apply i, apply b, <b><i>hi</i></b>. Применяются снизу вверх: сначала tag("i") оборачивает функцию, затем tag("b") оборачивает результат.

Что выведет

apply i
apply b
<b><i>hi</i></b>

Разбор

Применяются снизу вверх: сначала tag("i") оборачивает функцию, затем tag("b") оборачивает результат. При вызове внешняя обёртка b вызывает внутреннюю i, отсюда <b><i>hi</i></b>.

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

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