Deshabilitar aserciones en Python

¿Cómo deshabilito aserciones en Python?

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

¿Cómo puedo hacer eso?

¿Cómo deshabilito aserciones en Python?

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

Demuestro cada uno.

Para todo el proceso.

El uso del indicador -O (capital O) desactiva todas las declaraciones de afirmación en un proceso.

Por ejemplo:

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

Tenga en cuenta que al deshabilitar quiero decir que tampoco ejecuta la expresión que la sigue:

 $ python -Oc "assert 1/0" $ python -c "assert 1/0" Traceback (most recent call last): File "", line 1, in  ZeroDivisionError: integer division or modulo by zero 

Por el medio ambiente

Puedes usar una variable de entorno para establecer esta bandera también.

Esto afectará a todos los procesos que utilizan o heredan el entorno.

Por ejemplo, en Windows, configurar y luego borrar la variable de entorno:

 C:\>python -c "assert False" Traceback (most recent call last): File "", line 1, in  AssertionError C:\>SET PYTHONOPTIMIZE=TRUE C:\>python -c "assert False" C:\>SET PYTHONOPTIMIZE= C:\>python -c "assert False" Traceback (most recent call last): File "", line 1, in  AssertionError 

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

Un solo punto en el código

Continúas tu pregunta:

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

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

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

que imprime:

 AssertionError('we know this fails',) 

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

Referencias

De la documentación del assert :

Una aseveración 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

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

y

PYTHONOPTIMIZE

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

Llame 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  assert(False) AssertionError C:\temp\py>C:\Python26\python.exe -O test.py Done 

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

Aquí está la diferencia entre ellos:

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

  • -OO Deseche las cadenas de documentación además de las optimizaciones -O .

(De la documentación de Python )

Utilice python -O :

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

NO debe deshabilitar (la mayoría) las aserciones. Atrapan errores imprevistos cuando la atención está en otra parte. Ver la Regla 5 en “El poder de diez” .

En su lugar, guarde algunas verificaciones de afirmaciones 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 aserciones importantes, y permitir que se optimicen las afirmaciones de aserciones, es elevándolas dentro de una statement de selección:

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

Ejecutar en modo optimizado debe hacerlo:

 python -OO module.py