Subir advertencia en Python sin interrumpir el programa


Estoy tratando con un problema de cómo levantar una advertencia en Python sin tener que dejar que el programa se bloquee / detenga / interrumpa.

Utilizo la siguiente función simple que solo comprueba si el usuario le pasó un número distinto de cero. Si el usuario pasa un cero, el programa debe advertir al usuario, pero continuar normalmente. Debería funcionar como el siguiente código, pero debería usar la clase Warning (), Error() o Exception () en 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 código debajo y pase 0 a la función, el programa se bloquea y el valor nunca se devuelve. En su lugar, 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 una advertencia ha sido lanzada probándola por unittest. Si simplemente imprimo el mensaje, no puedo probarlo con assertRaises en unittest.

Author: A-B-B, 2010-10-08

3 answers

No deberías raise la advertencia, deberías usar warnings módulo. Al elevarlo estás generando un error, en lugar de una advertencia.

 81
Author: SilentGhost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-03 23:32:22
import warnings
warnings.warn("Warning...........Message")

Vea la documentación de python: aquí

 165
Author: necromancer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-08 15:11:33

Por defecto, a diferencia de una excepción, una advertencia no interrumpe.

Después de importar warnings, se recomienda especificar una clase Warnings al generar una advertencia. Si uno no se especifica, es literalmente UserWarning por defecto. Esto no se ve muy bien:

>>> warnings.warn('This is my lazy warning.')
<string>:1: UserWarning: This is my lazy warning.

Simplemente usar una clase preexistente en su lugar, e. g.Warning:

>>> warnings.warn('This is my generic warning.', Warning)
<string>:1: Warning: This is my generic warning.

Crear una clase de advertencia personalizada es similar a crear una clase de excepción personalizada:

>>> class MyCustomWarning(UserWarning):
...     pass
... 
... warnings.warn('This is my custom warning.', MyCustomWarning)

<string>:1: MyCustomWarning: This is my custom warning.

Para probando, considere assertWarns o assertWarnsRegex.

 6
Author: A-B-B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-28 15:00:20