Ich versuche, eine Warnung in Python auszulösen, ohne dass das Programm abstürzt / stoppt / unterbricht.
Ich benutze die folgende einfache Funktion, um zu überprüfen, ob der Benutzer eine Zahl ungleich Null an ihn übergeben hat. In diesem Fall sollte das Programm sie warnen, aber wie gewohnt fortfahren. Es sollte unter wie der Code arbeitet, soll aber Klasse verwenden Warning()
, Error()
oder Exception()
stattdessen die Warnung auszudrucken manuell.
def is_zero(i):
if i != 0:
print "OK"
else:
print "WARNING: the input is 0!"
return i
Wenn ich den folgenden Code verwende und 0 an die Funktion übergebe, stürzt das Programm ab und der Wert wird nie zurückgegeben. Stattdessen möchte ich, dass das Programm normal fortgesetzt wird und den Benutzer darüber informiert, dass er 0 an die Funktion übergeben hat.
def is_zero(i):
if i != 0:
print "OK"
else:
raise Warning("the input is 0!")
return i
Ich möchte in der Lage sein zu testen, ob eine Warnung ausgelöst wurde, indem ich sie von unittest teste. Wenn ich die Nachricht einfach ausdrucke, kann ich sie nicht mit assertRaises in unittest testen.
quelle
print
die Nachricht?Antworten:
Sie sollten nicht
raise
die Warnung, Sie solltenwarnings
Modul verwenden. Indem Sie es auslösen, generieren Sie eher Fehler als Warnungen.quelle
warnings.catch_warnings
Kontextmanager, mit dem Sie dies tun können.Siehe die Python-Dokumentation: hier
quelle
warnings.warn("blabla", DeprecationWarning)
für das Hinzufügen einer Klasse zu der Art von Warnung, die ausgegeben wirdIm Gegensatz zu einer Ausnahme wird eine Warnung standardmäßig nicht unterbrochen.
Danach
import warnings
kann beim Generieren einer Warnung eine Warnings- Klasse angegeben werden. Wenn eines nicht angegeben ist, ist es buchstäblichUserWarning
standardmäßig.Um stattdessen einfach eine bereits vorhandene Klasse zu verwenden, z
DeprecationWarning
.Das Erstellen einer benutzerdefinierten Warnklasse ähnelt dem Erstellen einer benutzerdefinierten Ausnahmeklasse:
Betrachten Sie zum Testen
assertWarns
oderassertWarnsRegex
.Als Alternative, insbesondere für eigenständige Anwendungen, sollten Sie das
logging
Modul in Betracht ziehen . Es kann Nachrichten mit einer Debug- , Info- , Warn- , Fehlerstufe usw. protokollieren . Protokollnachrichten mit einer Warnstufe oder höher werden standardmäßig auf stderr gedruckt.quelle