Sie können bekommen, was Sie wollen, indem Sie zuweisen warnings.showwarning
. In der Dokumentation zum Warnmodul selbst wird empfohlen, dies zu tun, damit Sie nicht von der dunklen Seite der Quelle in Versuchung geführt werden . :) :)
Sie können diese Funktion durch eine alternative Implementierung ersetzen, indem Sie sie zuweisen warnings.showwarning
.
Sie können eine neue Funktion definieren, die das tut, was warning.showwarning
normalerweise funktioniert, und zusätzlich den Stapel drucken. Dann platzieren Sie es anstelle des Originals:
import traceback
import warnings
import sys
def warn_with_traceback(message, category, filename, lineno, file=None, line=None):
log = file if hasattr(file,'write') else sys.stderr
traceback.print_stack(file=log)
log.write(warnings.formatwarning(message, category, filename, lineno, line))
warnings.showwarning = warn_with_traceback
Danach druckt jede Warnung den Stack-Trace sowie die Warnmeldung. Beachten Sie jedoch, dass nichts passiert, wenn die Warnung ignoriert wird, weil sie nicht die erste ist. Sie müssen also Folgendes ausführen:
warnings.simplefilter("always")
Sie können eine ähnliche Steuerung erhalten, die Sie numpy.seterr
über die warning
Filter des Moduls erhalten
Wenn Python jedes Mal, wenn es ausgelöst wird, und nicht nur beim ersten Mal jede Warnung meldet, können Sie Folgendes einschließen:
import warnings
warnings.simplefilter("always")
Sie können andere Verhaltensweisen erzielen, indem Sie andere Zeichenfolgen als Argumente übergeben. Mit derselben Funktion können Sie auch unterschiedliche Verhaltensweisen für Warnungen angeben, abhängig von dem Modul, das sie ausgelöst hat, der von ihnen bereitgestellten Nachricht, der Warnklasse, der Codezeile, die sie verursacht, usw.
Sie können die Liste in der Moduldokumentation überprüfen
Als Beispiel können Sie alle Warnungen so einstellen, dass Ausnahmen ausgelöst werden, mit Ausnahme DeprecationWarnings
derjenigen, die vollständig ignoriert werden sollten:
import warnings
warnings.simplefilter("error")
warnings.simplefilter("ignore", DeprecationWarning)
Auf diese Weise erhalten Sie den vollständigen Traceback für jede Warnung, die als Fehler ausgegeben wird (nur die erste, da die Ausführung stoppt ... Sie können sie jedoch einzeln ansprechen und einen Filter erstellen, um diejenigen zu ignorieren, die Sie nicht hören möchten ungefähr wieder ...