Собственно и весь вопрос в заголовке.
Если такой возможности нет, то не пойму, в чем ценность такой инструкции как assert вообще?
А то как-то все неубедительно. Ведь можно простыми if ...: print() в одну строку обойтись...
P.S: я уже получил ответ от andreymal, однако интересно отключить assert первой строчкой в коде... возможно ли это? Ведь os.environ читается до первой строчки модуля...
Ответ
assert, в отличие от if, предназначен для обнаружения ситуаций, которые задумывались как в принципе невозможные в программе: для поиска багов. Отключать assert обычно не стоит, но для ускорения программы это иногда может быть полезным.
Для его отключения есть несколько способов.
Для отдельного Python-процесса
Использование флага -O (большая латинская O) включает базовую оптимизацию и отключает все assertы в данном процессе.
Пример:
$ python -Oc "assert False"
$ python -c "assert False"
Traceback (most recent call last):
File "
Для окружения
Можно использовать переменную окружения для установки этого флага. Тогда он будет применён ко всем процессам, использующим данное окружение.
Например, установка и очистка переменной окружения в Windows:
C:\>python -c "assert False"
Traceback (most recent call last):
File "
C:\>python -c "assert False"
C:\>SET PYTHONOPTIMIZE=
C:\>python -c "assert False"
Traceback (most recent call last):
File "
Для конкретного места в коде
Когда выражение, прописанное в assert, ложно, выбрасывается исключение AssertionError. Если ожидается, что такой-то assert провалится, можно просто перехватить это исключение:
>>> try:
... assert False, "мы знаем, что это упадёт"
... except AssertionError as e:
... print(repr(e))
...
AssertionError('мы знаем, что это упадёт',)
После такого перехвата исключения, если вы не выбросите новое исключение, программа продолжит выполняться дальше.
(Впрочем, так делать плохо: если assert провалился, нужно принять все меры по исправлению программы так, чтобы он больше не проваливался, а не скрывать возможный баг таким костылём.)
Дополнительная информация
Из документации assert
Выражение с assert, вроде такого:
assert expression #, optional_message
Эквивалентно такому коду:
if __debug__:
if not expression: raise AssertionError #(optional_message)
И
встроенная переменная __debug__ имеет значение True в обычных условиях и False, если включены оптимизации (аргумент командной строки -O).
Из документации по использованию python
-O
Включает базовые оптимизации. См. также PYTHONOPTIMIZE
и
PYTHONOPTIMIZE
Если эта переменная является непустой строкой, это аналогично использованию опции -O.
Если в переменной указано целое число, это аналогично добавлению опции -O несколько раз.
Слегка вольный перевод ответа от Aaron Hall на enSO
Комментариев нет:
Отправить комментарий