Assert и пустые коллекции в Python

Assert и пустые коллекции в Python

@python_quiz

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

Коротко: в коде используется assert для проверки аргумента, а затем берётся длина списка. Поведение зависит от того, как интерпретатор обрабатывает оператор assert.

Исходный код

python

Пошаговый разбор

  1. Функция объявлена с аргументом по умолчанию data=None, но при вызове передаётся явный пустой список [].
  2. Оператор assert data, "empty!" проверяет истинность data. В Python пустой список оценивается как логическое False.
  3. Если условие assert ложно, генерируется исключение AssertionError с переданным сообщением.
  4. При возникновении исключения выполнение функции прерывается — выражение return len(data) не выполняется.

Итого: в обычном запуске (без специальных флагов интерпретатора) код приведёт к выбросу AssertionError с сообщением "empty!".

Почему не будет вывода 0 или None

  • «Выведет 0» — такое поведение возможно только если проверка assert вообще не выполнится (т.е. оператор assert не будет присутствовать в исполняемом коде). С обычным запуском это не так.
  • «Выведет None» — функция возвращает значение len(data), а не None. None вернулся бы только если бы функция завершилась без явного return, или если бы печаталась переменная, содержащая None.

Влияние флага -O

Интересный момент: при запуске интерпретатора с оптимизацией (python -O) операторы assert удаляются из байткода. Тогда проверка отсутствует, функция просто выполнит return len(data) и для пустого списка вернёт 0 — и на экран попадёт 0.

Пример запуска в оболочке:

bash

(В некоторых окружениях вывод может по-разному отображаться, но принцип: assert удаляется при -O.)

Демонстрация с обработкой исключения

Чтобы явно показать поведение без перезапуска интерпретатора, можно поймать исключение внутри программы:

python

Ожидаемый вывод при обычном запуске:

Рекомендации и лучшие практики

  • Не используйте assert для проверки внешних данных (входных параметров в runtime). assert предназначен для отладки и внутренних инвариантов.
  • Для валидации аргументов лучше использовать явные проверки и бросать подходящее исключение, например ValueError или TypeError:
python
  • Помните, что поведение кода может измениться при запуске с флагом -O, поэтому опираться на assert для логики программы опасно.

Вывод

Оператор assert бросит исключение для пустого списка в обычном интерпретаторе, а при запуске с оптимизацией (-O) проверки assert удаляются и функция вернёт длину (0). Для надёжной валидации параметров используйте явные проверки и соответствующие исключения.

Report Page