Assert и пустые коллекции в Python
@python_quizРазберем этот квиз
Коротко: в коде используется assert для проверки аргумента, а затем берётся длина списка. Поведение зависит от того, как интерпретатор обрабатывает оператор assert.
Исходный код

Пошаговый разбор
- Функция объявлена с аргументом по умолчанию
data=None, но при вызове передаётся явный пустой список []. - Оператор
assert data, "empty!"проверяет истинностьdata. В Python пустой список оценивается как логическое False. - Если условие
assertложно, генерируется исключениеAssertionErrorс переданным сообщением. - При возникновении исключения выполнение функции прерывается — выражение
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.
Пример запуска в оболочке:

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

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

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

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