Поведение assert и формат вывода исключения в Python

Поведение assert и формат вывода исключения в Python

@python_quiz

Разберем этот квиз

Короткий код для анализа:

python

Ниже — что здесь происходит и почему программа выведет именно то, что вы видите.

Что делает assert в Python

  • Выражение assert condition, message проверяет condition.
  • Если условие ложно, выбрасывается AssertionError с сообщением message.
  • Важно: при запуске интерпретатора с оптимизацией (python -O) утверждения (assert) отключаются. В обычном запуске assert активен.

Разбиение кода по шагам

  1. В safe_div проверяем y != 0. При y == 0 условие ложно.
  2. Выполняется assert, который выбрасывает AssertionError('zero division').
  3. Этот AssertionError перехватывается блоком except AssertionError as e.
  4. Внутри except печатается два значения:

- type(e).__name__ — имя класса исключения, строка "AssertionError".
- e.args[0] — первый элемент кортежа args у исключения, то есть строка "zero division".

Ожидаемый вывод

В результате выполнения кода будет напечатано:

Первое слово — имя исключения, второе — сообщение из assert, разделённые пробелом из-за поведения print (по умолчанию пробел между аргументами).

Анализ вариантов ответов (кратко)

  • «Ничего не выведется, программа завершится с ошибкой» — неверно: исключение перехвачено в except, поэтому программа не прервётся, а напечатает результат.
  • «Будет выведено: AssertionError» — неполный вариант: пропущено сообщение zero division, которое явно печатается через e.args[0].
  • «Будет выведено: AssertionError zero 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".

Report Page