Jaka jest różnica między nimi warnings.warn()
i logging.warn()
pod względem tego, co robią i jak należy ich używać?
82
Jaka jest różnica między nimi warnings.warn()
i logging.warn()
pod względem tego, co robią i jak należy ich używać?
Odpowiedzi:
Jeden z nich wywołuje wyjątek, który można przechwycić lub zignorować w razie potrzeby, a drugi opcjonalnie dodaje wpis do dziennika na podstawie bieżącego poziomu rejestrowania. Jeden powinien być używany, gdy jeden ostrzega o różnych rzeczach w kodzie, a drugi powinien być używany podczas logowania.
źródło
logging.captureWarnings()
). Wiadomości ostrzegawcze są domyślnie wyświetlane tylko raz, jak wyjaśnił @cxrodgers, aby poinformować użytkownika, aby zmienił swój kod. Logując się na innych i dokumentując wszystkie ostrzeżenia, można jednak skonfigurować, co ma być wyświetlane szczegółowo. Ostrzeżenia można zgłaszać do wyjątków za pomocą opcji `-W błąd '.warnings
czylogging
?Zgadzam się z drugą odpowiedzią -
logging
służy do logowania iwarning
jest ostrzeżeniem - ale chciałbym dodać więcej szczegółów.Oto HOWTO w stylu samouczka, przeprowadzające Cię przez kolejne etapy korzystania z
logging
modułu. https://docs.python.org/3/howto/logging.htmlTo bezpośrednio odpowiada na twoje pytanie:
źródło
logging.warning
po prostu rejestruje coś naWARNING
poziomie, w taki sam sposób, jaklogging.info
loguje naINFO
poziomie ilogging.error
rejestruje naERROR
poziomie. Nie ma specjalnego zachowania.warnings.warn
emituje aWarning
, który może zostać wydrukowanystderr
, całkowicie zignorowany lub wyrzucony jak normalnyException
(potencjalnie powodujący awarię aplikacji) w zależności od dokładnejWarning
wyemitowanej podklasy i sposobu skonfigurowania filtru ostrzeżeń . Domyślnie ostrzeżenia będą drukowanestderr
lub ignorowane.Ostrzeżenia emitowane przez program
warnings.warn
są często przydatne, ale łatwo je przeoczyć (zwłaszcza jeśli uruchamiasz program w Pythonie w tle i nie przechwytujeszstderr
). Z tego powodu ich zalogowanie może być pomocne.Python zapewnia wbudowaną integrację między
logging
modułem awarnings
modułem, aby umożliwić ci to; wystarczy wywołaćlogging.captureWarnings(True)
na początku skryptu, a wszystkie ostrzeżenia wysyłane przezwarnings
moduł będą automatycznie rejestrowane na poziomieWARNING
.źródło
Oprócz wyjaśnienia kanonicznego w oficjalnej dokumentacji
Warto też zaznaczyć, że domyślnie
warnings.warn("same message")
pojawi się tylko raz. To główna zauważalna różnica. Cytat z oficjalnego doc>>> 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") >>>
źródło