模塊 warnings 在程序運行中,向用戶報告非嚴重錯誤,它是由 Python 3.0 版本引入的。使用的情況包括向庫調用者警告一些函數將來可能廢棄,或者提示一些錯誤的配置信息,不支持的特性等等。
因為報告的不是嚴重的錯誤,一個程序可能會遇到多個重複的問題。warnings 可以抑制重複的錯誤信息,使你不用多次看到他們。方法是可以通過命令行傳遞參數或者調用 warnings 內的函數。
類別和過濾操作
warnings 可以擴展內置的基類 Warning 來分類,可以查看模塊 exceptions 瞭解詳情。
warnings 還可以通過設置過濾修改模塊內部的行為,包含6種操作:
- error 把警告轉換為異常
- ignore 忽略警告
- always 總是發出警告
- default 在每個位置打印警告
- module 在每個模塊打印警告
- once 只打印一次
生成 warnings
最簡單的生成 warning 是調用 warn() 函數,傳遞的參數為消息內容。
執行:
可以看到,雖然 warning 調用了,但是程序還是繼續往下運行,默認的行為會繼續運行下去。可以調用函數 simplefilter() 改變這種行為。
執行:
在這個例子中,使用 simplefilter() 函數告訴 warnings 模塊內部當發生警告 UserWarning 時,觸發異常。查看輸出,最後打印數據的語句沒有執行,程序中途停止運行了。
也可以使用命令行傳遞參數達到同樣的效果。
模式匹配過濾
還可以通過函數 filterwarnings() 過濾更復雜的匹配,例如設定一個正則表達式過濾消息內容。
執行:
本例忽略包含 hello 消息的警告,還可以通過命令行修改過濾行為,查看下面的例子。
執行:
重複的警告
默認大部分的警告只在觸發的位置打印一次,請看下面的例子。
執行:
下面的例子會打印兩次,因為他們觸發的位置不一樣。
執行:
可以通過 simplefilter() 改變這種行為,使得不同位置相同的消息內容只警告一次。
執行:
改變消息輸出位置
正常情況下,警告消息輸出到 sys.stderr。可以通過修改模塊函數 showwarning() 覆蓋默認的行為。下面的代碼,重定向消息到日誌模塊。
執行:
格式化消息
如果想自定義消息格式,可以修改模塊函數 formatwarning()
執行:
閱讀更多 趣喜歡編程 的文章