J'essaye de déclencher un avertissement en Python sans faire planter / arrêter / interrompre le programme.
J'utilise la fonction simple suivante pour vérifier si l'utilisateur lui a passé un nombre non nul. Si tel est le cas, le programme devrait les avertir, mais continuer comme d'habitude. Cela devrait fonctionner comme le code ci-dessous, 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 plante 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é émis en le testant par unittest. Si j'imprime simplement le message, je ne peux pas le tester avec assertRaises in unittest.
la source
print
le message?Réponses:
Vous ne devriez pas
raise
l'avertissement, vous devriez utiliserwarnings
module. En le soulevant, vous générez une erreur plutôt qu'un avertissement.la source
warnings.catch_warnings
gestionnaire de contexte qui vous permettra de le faire.Voir la documentation python: ici
la source
warnings.warn("blabla", DeprecationWarning)
pour avoir ajouté une classe au type d'avertissement émisPar défaut, contrairement à une exception, un avertissement ne s'interrompt pas.
Ensuite
import warnings
, il est possible de spécifier une classe Warnings lors de la génération d'un avertissement. Si l'un n'est pas spécifié, c'est littéralementUserWarning
par défaut.Pour utiliser simplement une classe préexistante à la place, par exemple
DeprecationWarning
:La création d'une classe d'avertissement personnalisée est similaire à la création d'une classe d'exception personnalisée:
Pour les tests, considérez
assertWarns
ouassertWarnsRegex
.Comme alternative, en particulier pour les applications autonomes, considérez le
logging
module. Il peut enregistrer les messages ayant un niveau de débogage , d' informations , d' avertissement , d' erreur , etc. Les messages de journal ayant un niveau d' avertissement ou supérieur sont par défaut imprimés sur stderr.la source