Подтвердить что ты не робот

Отключить утверждения в Python

Как отключить утверждения в Python?

То есть, если утверждение терпит неудачу, я не хочу, чтобы он выбрал AssertionError, но продолжал идти.

Как это сделать?

4b9b3361

Ответ 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:

Утверждение утверждения, подобное этому:

assert expression #, optional_message

Эквивалентно

if __debug__:
    if not expression: raise AssertionError #(optional_message)

И,

встроенная переменная __debug__ - это True при нормальных условиях, False, когда запрашивается оптимизация (опция командной строки -O).

и далее

Назначения __debug__ являются незаконными. Значение для встроенной переменной определяется при запуске интерпретатора.

Из документации по использованию:

-O

Включите основные оптимизации. Это изменяет расширение имени файла для скомпилированных (байт-код) файлов с .pyc на .pyo. Смотрите также PYTHONOPTIMIZE.

и

PYTHONOPTIMIZE

Если это не пустая строка, это эквивалентно чтобы указать опцию -O. Если задано целое число, оно эквивалентно указав -O несколько раз.

Ответ 2

Вызов 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

Ответ 3

Оба из двух уже предоставленных ответов действительны (вызовите Python с помощью -O или -OO в командной строке).

Вот разница между ними:

  • -O Включите базовые оптимизации. Это изменяет расширение имени файла для скомпилированных (байткодов) файлов с .pyc на .pyo.

  • -OO Отменить docstrings в дополнение к оптимизации -O.

(из документации Python)

Ответ 4

Используйте python -O:

$ python -O
>>> assert False
>>> 

Ответ 5

Вы должны НЕ отключить (большинство) утверждения. Они улавливают непредвиденные ошибки, когда внимание в другом месте. См. Правило 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!')

Ответ 6

Запуск в оптимизированном режиме должен сделать это:

python -OO module.py