In numpy können wir np.seterr(invalid='raise')
stattdessen einen Traceback für Warnungen erhalten, die einen Fehler auslösen (siehe diesen Beitrag ).
- Gibt es eine allgemeine Möglichkeit, Warnungen zu verfolgen?
- Kann ich Python erstellen, um einen Traceback zu geben, wenn eine Warnung ausgegeben wird?
Antworten:
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 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 diewarning
Filter des Moduls erhaltenWenn 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 ...
quelle
Führen Sie Ihr Programm wie aus
Das macht alle Warnungen fatal finden Sie hier für weitere Informationen
quelle
Sie können verwenden
warnings.filterwarnings()
ausgewählte Warnungen wie folgt in Ausnahmen umwandeln und einen Traceback erhalten:import warnings warnings.filterwarnings( 'error', 'DateTimeField .* received a naive datetime', RuntimeWarning, 'django.db.models.fields' )
quelle