Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Есть ли возможность отключить assert?

#python


Собственно и весь вопрос в заголовке.

Если такой возможности нет, то не пойму, в чем ценность такой инструкции как assert
вообще?

А то как-то все неубедительно. Ведь можно простыми if ...: print() в одну строку
обойтись...
P.S: я уже получил ответ от andreymal, однако интересно отключить assert первой строчкой
в коде... возможно ли это? Ведь os.environ читается до первой строчки модуля...
    


Ответы

Ответ 1



assert, в отличие от if, предназначен для обнаружения ситуаций, которые задумывались как в принципе невозможные в программе: для поиска багов. Отключать assert обычно не стоит, но для ускорения программы это иногда может быть полезным. Для его отключения есть несколько способов. Для отдельного Python-процесса Использование флага -O (большая латинская O) включает базовую оптимизацию и отключает все assertы в данном процессе. Пример: $ python -Oc "assert False" $ python -c "assert False" Traceback (most recent call last): File "", line 1, in AssertionError Для окружения Можно использовать переменную окружения для установки этого флага. Тогда он будет применён ко всем процессам, использующим данное окружение. Например, установка и очистка переменной окружения в Windows: C:\>python -c "assert False" Traceback (most recent call last): File "", line 1, in AssertionError C:\>SET PYTHONOPTIMIZE=TRUE C:\>python -c "assert False" C:\>SET PYTHONOPTIMIZE= C:\>python -c "assert False" Traceback (most recent call last): File "", line 1, in AssertionError Для конкретного места в коде Когда выражение, прописанное в 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

Комментариев нет:

Отправить комментарий