Что выведет код Middle Исключения и контекстные менеджеры обновлено

Контекстный менеджер подавляет ошибку

Вопрос

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

class Guard:
    def __enter__(self):
        print('enter')
        return 'res'
    def __exit__(self, et, e, tb):
        print('exit', et.__name__ if et else None)
        return et is KeyError

with Guard() as r:
    print(r)
    {}['x']
print('after 1')
try:
    with Guard():
        raise ValueError
except ValueError:
    print('caught')

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

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

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

Коротко

Код выведет: enter, res, exit KeyError, after 1, enter, exit ValueError, caught. as получает результат enter.

Что выведет

enter
res
exit KeyError
after 1
enter
exit ValueError
caught

Разбор

as получает результат __enter__. KeyError внутри with передаётся в __exit__, тот возвращает True, и исключение подавлено: выполнение идёт дальше. Для ValueError __exit__ возвращает False, исключение уходит наружу и ловится внешним try.

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

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