web-dev-qa-db-fra.com

Raise warning dans Python sans interrompre le programme

Je suis confronté à un problème: comment déclencher un avertissement dans Python sans devoir laisser le programme se bloquer/s’arrêter/s’interrompre.

J'utilise la fonction simple suivante qui vérifie uniquement 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. Cela devrait fonctionner comme le code suivant, mais devrait utiliser la classe Warning (), Error () ou Exception () au lieu d’afficher manuellement l’avertissement.

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 passe 0 à la fonction, le programme se bloque et la valeur n'est jamais renvoyée. Au lieu de cela, je veux que le programme continue normalement et juste informer 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 vérifier qu'un avertissement a été lancé pour le tester. Si j'imprime simplement le message, je ne pourrai pas le tester avec assertRaises en unittest.

137
Tomas Novotny

Vous ne devriez pas raise l'avertissement, vous devriez utiliser le module warnings . En le soulevant, vous générez des erreurs plutôt que des avertissements.

115
SilentGhost
import warnings
warnings.warn("Warning...........Message")

Voir la python: ici

222
necromancer

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

Après import warnings, il est possible de spécifier une classe Warnings lors de la génération d’un avertissement. Si aucun n'est spécifié, il s'agit littéralement de UserWarning par défaut.

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

Pour utiliser simplement 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.

La création d'une classe d'avertissement personnalisée 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 tester, considérons assertWarns ou assertWarnsRegex .


Comme alternative, en particulier pour les applications autonomes, considérons le module logging. Il peut enregistrer des messages ayant un niveau de débogage , info , warning , error , etc. Enregistrez les messages ayant un niveau de warning ou supérieur sont imprimés par défaut sur stderr.

31
Acumenus