На этом шаге мы рассмотрим синтаксис этой конструкции.
Прежде чем вы начнете применять какое-то функциональное средство языка, всегда неплохо подробнее познакомиться с тем, как оно практически реализуется в Python. Поэтому давайте бегло взглянем на синтаксис инструкции assert в соответствии с документацией Python:
инструкция_assert ::= "assert" выражение1 ["," выражение2]
В данном случае выражение1 - это условие, которое мы проверяем, а необязательное выражение2 - это сообщение об ошибке, которое выводится на экран, если утверждение дает сбой. Во время исполнения программы интерпретатор Python преобразовывает каждую инструкцию assert примерно в следующую ниже последовательность инструкций:
if __debug__: if not выражение1: raise AssertionError(выражение2)
Перед тем как данное условие инструкции assert будет проверено, проводится дополнительная проверка глобальной переменной __debug__. Это встроенный булев флажок, который при нормальных обстоятельствах имеет значение True, - и значение False, если запрашивается оптимизация. Мы поговорим об этом подробнее чуть позже в разделе, посвященном "распространенным ловушкам".
Кроме того, вы можете применить выражение2, чтобы передать необязательное сообщение об ошибке, которое будет показано в отчете об обратной трассировке вместе с исключением AssertionError. Это может еще больше упростить отладку. Например, это может быть код такого плана:
>>> if cond == 'x': do_x() elif cond == 'y': do_y() else: assert False, ('Это никогда не должно произойти, и тем не менее это ' 'временами происходит. Сейчас мы пытаемся выяснить ' 'причину. Если вы столкнетесь с этим на практике, то ' 'просим связаться по электронной почте с dbader. Спасибо!')
Разве это не ужасно? Конечно, да. Но этот прием определенно допустим и полезен, если в одном из своих приложений вы сталкиваетесь с плавающей ошибкой Гейзенбаг.
На следующем шаге мы рассмотрим распространенные ловушки, связанные с использованием инструкции assert в Python.