with try sirve que para handling exceptions error ejemplos ejemplo python debugging exception-handling environment-variables assert

try - Inhabilitar aserciones en Python



python assert with string (6)

¿Cómo desactivo las afirmaciones en Python?

Es decir, si una afirmación falla, no quiero que arroje un AssertionError , sino que continúe.

¿Cómo puedo hacer eso?


¿Cómo desactivo las afirmaciones en Python?

Existen múltiples enfoques que afectan un solo proceso, el entorno o una sola línea de código.

Yo demuestro cada uno.

Para todo el proceso

El uso del indicador -O (mayúscula O) deshabilita todas las afirmaciones de afirmación en un proceso.

Por ejemplo:

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

Por el medio ambiente

Puede usar una variable de entorno para establecer este indicador también.

Esto afectará a cada proceso que usa o hereda el entorno.

Por ejemplo, en Windows, estableciendo y luego borrando la variable de entorno:

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

Lo mismo en Unix (usando set y unset para la funcionalidad respectiva)

Un solo punto en el código

Continúa tu pregunta:

si una afirmación falla, no quiero que arroje un AssertionError, sino que continúe.

Si desea que no se ejerza el código, puede detectar un error de aserción:

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

y seguirás yendo desde el punto en que manejaste el AssertionError .

Referencias

De la documentación assert :

Una declaración afirmativa como esta:

assert expression #, optional_message

Es equivalente a

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

Y,

la variable __debug__ es True en circunstancias normales, False cuando se solicita la optimización (opción de línea de comando -O ).

De los documentos de uso:

-O

Active las optimizaciones básicas. Esto cambia la extensión de nombre de archivo para los archivos compilados (bytecode) de .pyc a .pyo. Ver también PYTHONOPTIMIZE.

y

PYTHONOPTIMIZE

Si se establece en una cadena no vacía, equivale a especificar la opción -O . Si se establece en un entero, es equivalente a especificar -O varias veces.


Ejecutar en modo optimizado debería hacerlo:

python -OO module.py


Las dos respuestas ya dadas son válidas (llame a Python con -O o -OO en la línea de comando).

Aquí está la diferencia entre ellos:

  • -O Enciende optimizaciones básicas. Esto cambia la extensión de nombre de archivo para los archivos compilados (bytecode) de .pyc a .pyo.

  • -OO Descarta docstrings además de las optimizaciones -O .

(De la documentación de Python )


Llamar a Python con la bandera -O:

test.py:

assert(False) print ''Done''

Salida:

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


Use python -O :

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


NO deberías deshabilitar (la mayoría) de las afirmaciones. Capturan errores imprevistos cuando la atención está en otra parte. Ver la Regla 5 en "El poder de diez" .

En cambio, proteja algunas comprobaciones de aserciones caras por algo como:

import logging logger = logging.getLogger(__name__) if logger.getEffectiveLevel() < logging.DEBUG: ok = check_expensive_property() assert ok, ''Run !''

Una forma de mantener las afirmaciones importantes y permitir que las afirmaciones de afirmación se optimicen es planteándolas dentro de una declaración de selección:

if foo_is_broken(): raise AssertionError(''Foo is broken!'')