Поведение assert и формат вывода исключения в Python
@python_quizРазберем этот квиз
Короткий код для анализа:

Ниже — что здесь происходит и почему программа выведет именно то, что вы видите.
Что делает assert в Python
- Выражение
assert condition, messageпроверяетcondition. - Если условие ложно, выбрасывается
AssertionErrorс сообщениемmessage. - Важно: при запуске интерпретатора с оптимизацией (
python -O) утверждения (assert) отключаются. В обычном запускеassertактивен.
Разбиение кода по шагам
- В
safe_divпроверяемy != 0. Приy == 0условие ложно. - Выполняется
assert, который выбрасываетAssertionError('zero division'). - Этот
AssertionErrorперехватывается блокомexcept AssertionError as e. - Внутри
exceptпечатается два значения:
- type(e).__name__ — имя класса исключения, строка "AssertionError".
- e.args[0] — первый элемент кортежа args у исключения, то есть строка "zero division".
Ожидаемый вывод
В результате выполнения кода будет напечатано:

Первое слово — имя исключения, второе — сообщение из assert, разделённые пробелом из-за поведения print (по умолчанию пробел между аргументами).
Анализ вариантов ответов (кратко)
- «Ничего не выведется, программа завершится с ошибкой» — неверно: исключение перехвачено в
except, поэтому программа не прервётся, а напечатает результат. - «Будет выведено:
AssertionError» — неполный вариант: пропущено сообщениеzero division, которое явно печатается черезe.args[0]. - «Будет выведено:
AssertionErrorzero division» — соответствует тому, что мы видим при стандартном запуске. - «Будет выведено:
AssertionError('zero division',)» — неверно:e.argsэто кортеж с одним элементом, но код печатает именноe.args[0](строку), а не весь кортежe.args.
Дополнительные замечания
- Если вместо
e.args[0]напечататьe.args, вывод был бы('zero division',)— это кортеж. - Для более информативного вывода можно использовать
print(e)— это напечатает сообщение исключения (zero division) без имени класса. - Не используйте
assertдля проверки входных данных в публичных API, если код может запускаться с оптимизациями; для валидации лучше бросать явноValueErrorилиZeroDivisionError.
Заключение: в обычных условиях программа выведет "AssertionError zero division".