Сегодня разбираем самую необычную ошибку в Python — ту, которую мы провоцируем сами. Такой подход часто используют для отладки кода и дополнительных проверок в слабых местах.
Ситуация: вы пишете код на Python и решаете добавить проверки для отлавливания ошибок. Например, хотите убедиться, что переменная x равна 10, и если это не так — программа должна сообщить об ошибке. Для этого используете оператор assert:
x = 5
assert x == 10, "x должен быть равен 10"
И при запуске предсказуемо получаете ошибку:
❌ AssertionError: x должен быть равен 10
Что это значит: AssertionError возникает, когда проверка с помощью assert не проходит. Встроенный оператор assert
работает так:
- Если условие истинно — программа продолжает работу.
- Если условие ложно — Python останавливает выполнение и выводит AssertionError с вашим сообщением (если оно указано).
В примере выше x равен 5, а не 10, поэтому assert
срабатывает и вызывает ошибку.
Когда и зачем используют assert. Этот оператор полезен для:
- Отладки — быстрой проверки предположений в коде.
- Тестирования — например, в unit-тестах (хотя для сложных тестов лучше использовать unittest или pytest).
- Валидации входных данных (но в продакшене
assert
лучше заменять на явные проверки, так как его можно отключить флагом -O).
Что делать с ошибкой AssertionError?
На секунду забудем о том, что сами спровоцировали эту ошибку. Чтобы исправить AssertionError, есть два подхода.
1. Исправить условие, чтобы оно соответствовало реальности. Если x действительно должен быть 10, но в коде ошибка — значит, надо исправить значение:
x = 10 # Теперь проверка пройдёт
assert x == 10, "x должен быть равен 10"
2. Изменить саму проверку. Если условие слишком строгое, его можно ослабить. Например:
x = 5
assert x > 0, "x должен быть положительным" # Теперь ошибки не будет
Пример из реальной практики
Допустим, вы пишете функцию для деления чисел и хотите убедиться, что делитель не нулевой. Для этого как раз отлично подойдёт команда assert:
def divide(a, b):
assert b != 0, "Делитель не может быть нулём!"
return a / b
print(divide(10, 0)) # Вызовет AssertionError
Как улучшить обработку таких ошибок
Иногда лучше использовать обычное исключение ZeroDivisionError, так как assert можно случайно отключить:
def divide(a, b):
if b == 0:
raise ValueError("Делитель не может быть нулём!")
return a / b
Что в итоге
Выводы будут такие:
- AssertionError — это сигнал, что ваше предположение в
assert
оказалось неверным. - Используйте
assert
для отладки и тестов, но не для критичных проверок в продакшене. - Если получаете эту ошибку — либо исправьте данные, либо пересмотрите условие. Либо не используйте
assert
:)
Вам слово
Приходите к нам в соцсети поделиться своим мнением об ошибке и почитать, что пишут другие. А ещё там выходит дополнительный контент, которого нет на сайте: шпаргалки, опросы и разная дурка. В общем, вот тележка, вот ВК — велком!