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
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__
esTrue
en circunstancias normales,False
cuando se solicita la optimización (opción de línea de comando-O
).
De los documentos de uso:
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
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!'')