Was ist der Unterschied zwischen warnings.warn()
und logging.warn()
in Bezug auf das, was sie tun und wie sie verwendet werden sollten?
80
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.
quelle
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 derwarning
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.htmlEs beantwortet direkt Ihre Frage:
quelle
logging.warning
Protokolliert einfach etwas auf derWARNING
Ebene, genauso wie eslogging.info
auf derINFO
Ebene undlogging.error
auf derERROR
Ebene protokolliert . Es hat kein besonderes Verhalten.warnings.warn
Gibt eine ausWarning
, die gedrucktstderr
, vollständig ignoriert oder wie eine normaleException
Datei ausgelöst werden kann (was möglicherweise zum Absturz Ihrer Anwendung führt), abhängig von der genauenWarning
ausgegebenen Unterklasse und der Konfiguration Ihres Warnfilters . Standardmäßig werden Warnungen gedrucktstderr
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 erfassenstderr
). Aus diesem Grund kann es hilfreich sein, sie protokollieren zu lassen.Python bietet eine integrierte Integration zwischen dem
logging
Modul und demwarnings
Modul, damit Sie dies tun können. Rufen Sie einfachlogging.captureWarnings(True)
zu Beginn Ihres Skripts auf und alle vomwarnings
Modul ausgegebenen Warnungen werden automatisch auf der Ebene protokolliertWARNING
.quelle
Neben der kanonischen Erklärung in der offiziellen Dokumentation
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>>> 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") >>>
quelle