2012-03-07 121 views

回答

8

一個會引發一個可以根據需要捕獲或忽略的異常,另一個可以根據當前日誌記錄級別向日志中添加一個條目。當一個人在代碼中警告各種事情時應該使用一個,而在登錄時應該使用另一個。

35

我同意其他答案 - logging是用於日誌記錄和warning是警告 - 但我想添加更多的細節。

這是一個教程式HOWTO,帶您瞭解使用logging模塊的步驟。 http://docs.python.org/2/howto/logging.html

它直接回答你的問題:

warnings.warn()在庫中的代碼,如果這個問題是可以避免和 客戶端應用程序應該進行修改,以消除此警告

logging.warning ()如果沒有什麼客戶端應用程序可以做 關於這種情況,但事件仍應該注意到

16

logging.warning只是在WARNING級別上記錄了某些內容,方式與logging.info級別的日誌級別爲INFO級別和logging.error級別的級別相同。它沒有特殊的行爲。

warnings.warn發射Warning,其可以取決於精確Warning子發射和如何配置您警告過濾被打印到stderr,完全忽略,或拋出像正常Exception(可能崩潰應用程序)。默認情況下,警告將打印到stderr或忽略。

warnings.warn發出的警告常常對知道有用,但容易錯過(特別是如果您在後臺進程中運行Python程序並且不捕獲stderr)。出於這個原因,將它們記錄下來可能會有所幫助。 Python在logging模塊和warnings模塊之間提供了一個內置集成,讓您可以執行此操作;只需在腳本開始時撥打logging.captureWarnings(True)warnings模塊發出的所有警告將自動記錄在WARNING的級別。

6

除了在庫代碼canonical explanation in official documentation

warnings.warn()如果該問題是可以避免的,客戶端應用程序應該進行修改,以消除此警告

logging.warning()如果有什麼客戶端應用程序可以處理這種情況,但仍應注意事件

還值得注意的是,默認情況下warnings.warn("same message")只會顯示一次。這是一個重大的顯着差異。引自official 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") 
>>>