warnings --- 警告控制

原始碼:Lib/warnings.py


警告訊息通常會在需要提醒使用者程式中的某些狀況時發出,而該狀況(通常)不至於需要引發例外並終止程式。舉例來說,當程式使用一個過時的模組時,就可能會需要發出警告。

Python 程式設計師可以透過呼叫此模組中定義的 warn() 函式來發出警告。(C 語言的程式設計師則使用 PyErr_WarnEx();詳情請參閱 例外處理)。

警告訊息通常會被寫入 sys.stderr,但它們的處理方式可以被彈性地更改,從忽略所有警告到將它們轉為例外都可以。警告的處理方式會根據 警告類別、警告訊息的文本,以及發出警告的原始碼位置而有所不同。在同一個原始碼位置重複出現的特定警告通常會被抑制。

警告控制有兩個階段:首先,每當發出一個警告時,會先決定是否該發出訊息;接著,如果要發出訊息,它會使用一個可由使用者設定的掛鉤 (hook) 來格式化並印出。

是否要發出警告訊息是由 警告過濾器 所控制,它是一連串的匹配規則和動作。可以透過呼叫 filterwarnings() 來新增規則到過濾器中,並透過呼叫 resetwarnings() 將其重設為預設狀態。

警告訊息的印出是透過呼叫 showwarning() 來完成,而它可以被覆寫;此函式的預設實作會透過呼叫 formatwarning() 來格式化訊息,它也可以被自訂的實作使用。

也參考

logging.captureWarnings() 允許你使用標準的 logging 基礎設施來處理所有警告。

警告類別

有許多內建的例外代表警告類別。這種分類方式對於能夠過濾掉特定群組的警告很有用。

雖然這些在技術上是 內建例外,但它們被記錄在這裡,因為從概念上來說,它們屬於警告機制的一部分。

使用者程式碼可以透過繼承其中一個標準警告類別來定義額外的警告類別。一個警告類別必須永遠是 Warning 類別的子類別。

目前定義了以下警告類別:

類別

描述

Warning

這是所有警告類別的基底類別。它是 Exception 的子類別。

UserWarning

warn() 的預設類別。

DeprecationWarning

關於已棄用功能的警告的基底類別,當這些警告是針對其他 Python 開發者時(預設為忽略,除非由 __main__ 中的程式碼觸發)。

SyntaxWarning

Base category for warnings about dubious syntactic features (typically emitted when compiling Python source code, and hence may not be suppressed by runtime filters)

RuntimeWarning

關於可疑 runtime 功能的警告的基底類別。

FutureWarning

關於已棄用功能的警告的基底類別,當這些警告是針對以 Python 編寫的應用程式的終端使用者時。

PendingDeprecationWarning

關於未來將被棄用的功能的警告的基底類別(預設為忽略)。

ImportWarning

在引入模組過程中觸發的警告的基底類別(預設為忽略)。

UnicodeWarning

與 Unicode 相關的警告的基底類別。

BytesWarning

bytesbytearray 相關的警告的基底類別。

ResourceWarning

與資源使用相關的警告的基底類別(預設為忽略)。

在 3.7 版的變更: 在過去,DeprecationWarningFutureWarning 是根據一個功能是被完全移除還是改變其行為來區分的。它們現在是根據其目標受眾以及預設警告過濾器處理它們的方式來區分。

警告過濾器

警告過濾器控制警告是被忽略、顯示,還是轉為錯誤(引發一個例外)。

從概念上講,警告過濾器維護一個有序的過濾器規格串列;任何特定的警告都會依次與串列中的每個過濾器規格進行比對,直到找到匹配項;過濾器決定了匹配項的處理方式。每個條目都是一個 (action, message, category, module, lineno) 形式的元組,其中:

  • action 是以下字串之一: