Как отключить утверждения в Python?
То есть, если утверждение терпит неудачу, я не хочу, чтобы он выбрал AssertionError
, но продолжал идти.
Как это сделать?
Как отключить утверждения в Python?
То есть, если утверждение терпит неудачу, я не хочу, чтобы он выбрал AssertionError
, но продолжал идти.
Как это сделать?
Как отключить утверждения в 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
несколько раз.
Вызов Python с флагом -O:
test.py:
assert(False)
print 'Done'
Вывод:
C:\temp\py>C:\Python26\python.exe test.py
Traceback (most recent call last):
File "test.py", line 1, in <module>
assert(False)
AssertionError
C:\temp\py>C:\Python26\python.exe -O test.py
Done
Оба из двух уже предоставленных ответов действительны (вызовите Python с помощью -O
или -OO
в командной строке).
Вот разница между ними:
-O
Включите базовые оптимизации. Это изменяет расширение имени файла
для скомпилированных (байткодов) файлов с .pyc на .pyo.
-OO
Отменить docstrings в дополнение к оптимизации -O
.
(из документации Python)
Используйте python -O
:
$ python -O
>>> assert False
>>>
Вы должны НЕ отключить (большинство) утверждения. Они улавливают непредвиденные ошибки, когда внимание в другом месте. См. Правило 5 в "Мощность десяти" .
Вместо этого, защитите некоторые дорогие проверки утверждения чем-то вроде:
import logging
logger = logging.getLogger(__name__)
if logger.getEffectiveLevel() < logging.DEBUG:
ok = check_expensive_property()
assert ok, 'Run !'
Один из способов сохранить важные утверждения и разрешить оптимизацию операторов assert
- это сделать их в выражении выбора:
if foo_is_broken():
raise AssertionError('Foo is broken!')
Запуск в оптимизированном режиме должен сделать это:
python -OO module.py