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



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



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



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

653   6  

6 ответов:

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

существует несколько подходов, которые влияют на один процесс, среду или одну строку кода.

я демонстрирую каждый.

для всего процесса

С помощью -O flag (capital O) отключает все операторы assert в процессе.

например:

$ python -Oc "assert False"

$ python -c "assert False"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError

в среду

вы можете использовать переменная окружения, чтобы установить этот флаг, а также.

это повлияет на каждый процесс, который использует или наследует среду.

например, в 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, но продолжайте идти.

если вы хотите код, который не выполняется, вы можете поймать ошибку утверждения:

>>> try:
...     assert False, "we know this fails"
... except AssertionError as e:
...     print(repr(e))
...
AssertionError('we know this fails',)

и вы будете продолжать идти от точки вы обработали AssertionError.

ссылки

С the assert документация:

утверждение типа этого:

assert expression #, optional_message

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

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

и

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

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

- O

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

и

PYTHONOPTIMIZE

если это установлено в непустую строку, это эквивалентно для указания . Если задано целое число, оно эквивалентно указание -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 включите основные оптимизации. Это изменяет расширение файла для скомпилированных (байт-код) файлов .пык к.Пе.

  • -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

Comments

    Ничего не найдено.