Augmenter l’avertissement dans Python sans interrompre le programme

Je suis confronté à un problème sur la façon de générer un avertissement dans Python sans avoir à laisser le programme se bloquer / arrêter / interrompre.

J’utilise la fonction simple suivante qui vérifie uniquement si l’utilisateur lui a transmis un nombre différent de zéro. Si l’utilisateur passe un zéro, le programme devrait avertir l’utilisateur, mais continuer normalement. Il devrait fonctionner comme le code suivant, mais devrait utiliser la classe 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 que je 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 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 le plus souvent. Si j’imprime simplement le message, je ne suis pas en mesure de le tester avec assertRaises dans le meilleur des cas.

Vous ne devriez pas raise l’avertissement, vous devriez utiliser le module d’ warnings . En l’élevant, vous générez une erreur plutôt qu’un avertissement.

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

Voir la documentation de python: ici

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

Après avoir importé des warnings , il est recommandé de spécifier une classe Avertissements lors de la génération d’un avertissement. Si l’un n’est pas spécifié, il s’agit littéralement UserWarning par défaut. Cela n’a pas l’air très bien:

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

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

 >>> warnings.warn('This is my generic warning.', Warning) :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) :1: MyCustomWarning: This is my custom warning. 

Pour tester, considérez assertWarns ou assertWarnsRegex .