Ответ 1
Как отключить утверждения в Python?
Существует несколько подходов, которые влияют на один процесс, среду или одну строку кода.
Я демонстрирую каждый.
Для всего процесса
Использование флага -O
(заглавная O) отключает все операторы assert в процессе.
Например:
$ python -Oc "assert False"
$ python -c "assert False"
Traceback (most recent call last):
File "<string>", line 1, in <module>
AssertionError
Обратите внимание, что под отключением я подразумеваю, что он также не выполняет выражение, следующее за ним:
$ python -Oc "assert 1/0"
$ python -c "assert 1/0"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
Для окружающей среды
Вы также можете использовать переменную окружения, чтобы установить этот флаг.
Это повлияет на каждый процесс, который использует или наследует среду.
Например, в Windows установите, а затем очистите переменную среды:
C:\>python -c "assert False"
Traceback (most recent call last):
File "<string>", line 1, in <module>
AssertionError
C:\>SET PYTHONOPTIMIZE=TRUE
C:\>python -c "assert False"
C:\>SET PYTHONOPTIMIZE=
C:\>python -c "assert False"
Traceback (most recent call last):
File "<string>", line 1, in <module>
AssertionError
То же самое в Unix (используя set и unset для соответствующей функциональности)
Одна точка в коде
Вы продолжаете свой вопрос:
если утверждение не выполняется, я не хочу, чтобы оно выдавало ошибку AssertionError, а продолжало.
Если вы хотите, чтобы код не выполнялся, вы можете убедиться, что поток управления не достигает утверждения, например:
if False:
assert False, "we know this fails, but we don't get here"
или вы можете обнаружить ошибку подтверждения:
try:
assert False, "this code runs, fails, and the exception is caught"
except AssertionError as e:
print(repr(e))
который печатает:
AssertionError('this code runs, fails, and the exception is caught')
и вы продолжите движение с того места, где вы работали с AssertionError
.
Ссылки
Утверждение утверждения, подобное этому:
assert expression #, optional_message
Эквивалентно
if __debug__: if not expression: raise AssertionError #(optional_message)
И,
встроенная переменная
__debug__
- этоTrue
при нормальных условиях,False
, когда запрашивается оптимизация (опция командной строки-O
).
и далее
Назначения
__debug__
являются незаконными. Значение для встроенной переменной определяется при запуске интерпретатора.
Из документации по использованию:
Включите основные оптимизации. Это изменяет расширение имени файла для скомпилированных (байт-код) файлов с .pyc на .pyo. Смотрите также PYTHONOPTIMIZE.
и
Если это не пустая строка, это эквивалентно чтобы указать опцию
-O
. Если задано целое число, оно эквивалентно указав-O
несколько раз.