Was ist der Unterschied zwischen warnings.warn()
und logging.warn()
in Bezug auf das, was sie tun und wie sie verwendet werden sollten?
Was ist der Unterschied zwischen warnings.warn()
und logging.warn()
in Bezug auf das, was sie tun und wie sie verwendet werden sollten?
Antworten:
Einer löst eine Ausnahme aus, die nach Bedarf abgefangen oder ignoriert werden kann, und der andere fügt optional einen Eintrag zum Protokoll hinzu, der auf der aktuellen Protokollierungsstufe basiert. Eine sollte verwendet werden, wenn einer vor verschiedenen Dingen im Code warnt, und die andere sollte bei der Protokollierung verwendet werden.
logging.captureWarnings()
). Warnmeldungen werden standardmäßig nur einmal angezeigt, wie @cxrodgers erklärte, um den Benutzer anzuweisen, seinen Code zu ändern. Wenn Sie sich auf der anderen Seite anmelden und alle Warnungen dokumentieren, können Sie jedoch konfigurieren, was im Detail angezeigt werden soll. Warnungen können mit "-W error" zu Ausnahmen ausgelöst werden.
Ich stimme der anderen Antwort zu - logging
dient der Protokollierung und der warning
Warnung -, möchte aber weitere Details hinzufügen.
Hier ist eine Anleitung im Tutorial-Stil, die Sie durch die Schritte zur Verwendung des logging
Moduls führt.
https://docs.python.org/3/howto/logging.html
Es beantwortet direkt Ihre Frage:
warnings.warn () im Bibliothekscode, wenn das Problem vermeidbar ist und die Clientanwendung geändert werden sollte, um die Warnung zu beseitigen
logging.warning () Wenn die Clientanwendung nichts gegen die Situation unternehmen kann, sollte das Ereignis dennoch notiert werden
logging.warning
Protokolliert einfach etwas auf der WARNING
Ebene, genauso wie es logging.info
auf der INFO
Ebene und logging.error
auf der ERROR
Ebene protokolliert . Es hat kein besonderes Verhalten.
warnings.warn
Gibt eine aus Warning
, die gedruckt stderr
, vollständig ignoriert oder wie eine normale Exception
Datei ausgelöst werden kann (was möglicherweise zum Absturz Ihrer Anwendung führt), abhängig von der genauen Warning
ausgegebenen Unterklasse und der Konfiguration Ihres Warnfilters . Standardmäßig werden Warnungen gedruckt stderr
oder ignoriert.
Von ausgegebene Warnungen warnings.warn
sind oft nützlich, aber leicht zu übersehen (insbesondere, wenn Sie ein Python-Programm in einem Hintergrundprozess ausführen und nicht erfassen stderr
). Aus diesem Grund kann es hilfreich sein, sie protokollieren zu lassen.
Python bietet eine integrierte Integration zwischen dem logging
Modul und dem warnings
Modul, damit Sie dies tun können. Rufen Sie einfach logging.captureWarnings(True)
zu Beginn Ihres Skripts auf und alle vom warnings
Modul ausgegebenen Warnungen werden automatisch auf der Ebene protokolliert WARNING
.
Neben der kanonischen Erklärung in der offiziellen Dokumentation
warnings.warn () im Bibliothekscode, wenn das Problem vermeidbar ist und die Clientanwendung geändert werden sollte, um die Warnung zu beseitigen
logging.warning () Wenn die Clientanwendung nichts gegen die Situation unternehmen kann, sollte das Ereignis dennoch notiert werden
Es ist auch erwähnenswert, dass standardmäßig warnings.warn("same message")
nur einmal angezeigt wird. Das ist ein großer spürbarer Unterschied. Zitiert aus dem offiziellen Dokument
Wiederholungen einer bestimmten Warnung für denselben Quellspeicherort werden normalerweise unterdrückt.
>>> import warnings
>>> warnings.warn("foo")
__main__:1: UserWarning: foo
>>> warnings.warn("foo")
>>> warnings.warn("foo")
>>>
>>> import logging
>>> logging.warn("bar")
WARNING:root:bar
>>> logging.warn("bar")
WARNING:root:bar
>>> logging.warn("bar")
WARNING:root:bar
>>>
>>>
>>> warnings.warn("fur")
__main__:1: UserWarning: fur
>>> warnings.warn("fur")
>>> warnings.warn("fur")
>>>