Estoy tratando de generar una Advertencia en Python sin hacer que el programa se bloquee / pare / interrumpa.
Utilizo la siguiente función simple para verificar si el usuario le pasó un número distinto de cero. Si es así, el programa debería advertirles, pero continuar según lo normal. Debería funcionar como el código a continuación, pero debería usar class Warning()
, Error()
o en Exception()
lugar de imprimir la advertencia manualmente.
def is_zero(i):
if i != 0:
print "OK"
else:
print "WARNING: the input is 0!"
return i
Si uso el siguiente código y paso 0 a la función, el programa se bloquea y el valor nunca se devuelve. En cambio, quiero que el programa continúe normalmente y solo informe al usuario que pasó 0 a la función.
def is_zero(i):
if i != 0:
print "OK"
else:
raise Warning("the input is 0!")
return i
Quiero poder probar que se ha lanzado una advertencia probándola por unittest. Si simplemente imprimo el mensaje, no puedo probarlo con afirmarRaises en unittest.
fuente
print
el mensaje?Respuestas:
No debería
raise
la advertencia, debería estar utilizando elwarnings
módulo. Al aumentarlo, estás generando un error, en lugar de una advertencia.fuente
warnings.catch_warnings
administrador de contexto que te permitirá hacer esto.Vea la documentación de Python: aquí
fuente
warnings.warn("blabla", DeprecationWarning)
por agregar una clase al tipo de advertencia emitidaPor defecto, a diferencia de una excepción, una advertencia no interrumpe.
Después
import warnings
, es posible especificar una clase de Advertencias al generar una advertencia. Si no se especifica uno, es literalmenteUserWarning
por defecto.Para usar simplemente una clase preexistente, por ejemplo
DeprecationWarning
:Crear una clase de advertencia personalizada es similar a crear una clase de excepción personalizada:
Para la prueba, considere
assertWarns
oassertWarnsRegex
.Como alternativa, especialmente para aplicaciones independientes, considere el
logging
módulo. Puede registrar mensajes que tienen un nivel de depuración , información , advertencia , error , etc. Los mensajes de registro que tienen un nivel de advertencia o superior se imprimen por defecto en stderr.fuente