Déclencher un avertissement en Python sans interrompre le programme

J'ai affaire à un problème comment déclencher un avertissement en Python sans avoir à laisser le programme planter / arrêter / interrompre.

J'utilise la fonction simple suivante qui vérifie seulement si l'utilisateur lui a transmis un nombre non nul. Si l'utilisateur passe un zéro, le programme doit avertir l'utilisateur, mais continuer normalement. Il devrait fonctionner comme le code suivant, mais devrait utiliser Class Warning (), Error () ou Exception () au lieu d'imprimer l'avertissement manuellement.

def is_zero(i):
   if i != 0:
     print "OK"
   else:
     print "WARNING: the input is 0!"
   return i

Si j'utilise le code ci-dessous et passez 0 à la fonction, le programme se bloque et la valeur n'est jamais retournée. Au lieu de cela, je veux que le programme continue normalement et informe simplement l'utilisateur qu'il a passé 0 à la fonction.

def is_zero(i):
   if i != 0:
     print "OK"
   else:
     raise Warning("the input is 0!")
   return i

Je veux pouvoir tester qu'un avertissement a été lancé en le testant par unittest. Si j'imprime simplement le message, Je ne suis pas en mesure de le tester avec assertRaises dans unittest.

99
demandé sur A-B-B 2010-10-08 19:01:59

3 réponses

Vous ne devriez pas raise l'avertissement, vous devriez être en utilisant warnings le module. En l'élevant, vous générez une erreur plutôt qu'un avertissement.

81
répondu SilentGhost 2015-02-03 23:32:22
import warnings
warnings.warn("Warning...........Message")

Voir la documentation python: ici

165
répondu necromancer 2010-10-08 15:11:33

Par défaut, contrairement à une exception, un avertissement n'interrompt pas.

Après avoir importé warnings, il est recommandé de spécifier une classe Warnings lors de la génération d'un avertissement. Si l'on n'est pas spécifié, il est littéralement UserWarning par défaut. Cela n'a pas l'air très agréable:

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

Pour simplement utiliser une classe préexistante à la place, par exemple Warning:

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

Créer un avertissement de classe est similaire à la création d'une classe d'exception personnalisée:

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

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

Pour tests, envisager de assertWarns ou assertWarnsRegex.

6
répondu A-B-B 2018-03-28 15:00:20