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ć?
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.
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
czy logging
?
Zgadzam się z drugą odpowiedzią - logging
służy do logowania i warning
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.html
To bezpośrednio odpowiada na twoje pytanie:
warnings.warn () w kodzie biblioteki, jeśli problemu można uniknąć, a aplikację kliencką należy zmodyfikować w celu wyeliminowania ostrzeżenia
logging.warning (), jeśli aplikacja kliencka nie może nic zrobić w tej sytuacji, ale nadal należy odnotować zdarzenie
logging.warning
po prostu rejestruje coś na WARNING
poziomie, w taki sam sposób, jak logging.info
loguje na INFO
poziomie i logging.error
rejestruje na ERROR
poziomie. Nie ma specjalnego zachowania.
warnings.warn
emituje a Warning
, który może zostać wydrukowany stderr
, całkowicie zignorowany lub wyrzucony jak normalny Exception
(potencjalnie powodujący awarię aplikacji) w zależności od dokładnej Warning
wyemitowanej podklasy i sposobu skonfigurowania filtru ostrzeżeń . Domyślnie ostrzeżenia będą drukowane stderr
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 przechwytujesz stderr
). Z tego powodu ich zalogowanie może być pomocne.
Python zapewnia wbudowaną integrację między logging
modułem a warnings
modułem, aby umożliwić ci to; wystarczy wywołać logging.captureWarnings(True)
na początku skryptu, a wszystkie ostrzeżenia wysyłane przez warnings
moduł będą automatycznie rejestrowane na poziomie WARNING
.
Oprócz wyjaśnienia kanonicznego w oficjalnej dokumentacji
warnings.warn () w kodzie biblioteki, jeśli problemu można uniknąć, a aplikację kliencką należy zmodyfikować w celu wyeliminowania ostrzeżenia
logging.warning (), jeśli aplikacja kliencka nie może nic zrobić w tej sytuacji, ale nadal należy odnotować zdarzenie
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
Powtórzenia konkretnego ostrzeżenia dla tej samej lokalizacji źródłowej są zwykle pomijane.
>>> 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")
>>>