python之warnings模塊(warnings.filterwarnings("ignore")代碼解析)


前言

①Python通過調用  warnings  模塊中定義的  warn()  函數來發出警告。

②警告消息通常用於提示用戶一些錯誤或者過時的用法,當這些情況發生時我們不希望拋出異常或者直接退出程序。

③警告消息通常寫入 sys.stderr 向標准錯誤輸出信息,對警告的處理方式可以靈活的更改,例如忽略或者轉變為為異常。

④警告的處理可以根據警告類別,警告消息的文本和發出警告消息的源位置而變化。對相同源位置的特定警告的重復通常被抑制。

⑤警告控制分為兩個階段:首先,警告被觸發時,確定是否應該發出消息(警告過濾器);接下來,如果要發出消息,則使用用戶可設置的鈎子來格式化和打印消息。

警告過濾器可以用來控制是否發出警告消息,警告過濾器是一些匹配規則和動作的序列。可以通過調用  filterwarnings()  將規則添加到過濾器,並通過調用  resetwarnings()  將其重置為默認狀態。

警告消息的輸出是通過調用  showwarning()  函數來完成的,其可以被覆蓋;該函數的默認實現通過調用  formatwarning()  格式化消息,這也可以由自定義實現使用。

警告類別

內建警告類型:

可以通過繼承內建警告類型實現自定義的警告類型警告類型必須始終是 Warning 類的子類

例如:【輸出警告信息】

import warnings

warnings.warn('這是自定義的警告消息', category=UserWarning)

運行結果:

警告過濾器【warnings.filterwarnings("ignore")】

警告過濾器用於控制警告消息的行為,如忽略,顯示或轉換為錯誤(引發異常)

警告過濾器維護着一個有序的過濾規則列表,匹配規則用於確定如何處理警告,任何特定警告都將依次與列表中的每個過濾規則匹配,直到找到匹配為止。

過濾規則類型為一個元組 (action,message,category,module,lineno);

其中:

  • action 為以下值:

  • message 是包含正則表達式的字符串,警告消息的開始必須匹配,不區分大小寫
  • category 是一個警告類型(必須是 Warning 的子類)
  • module 是包含模塊名稱的正則表達式字符串,區分大小寫
  • lineno 是一個整數,警告發生的行號,為 0 則匹配所有行號

默認警告過濾器

默認情況下,Python 設置了幾個警告過濾器,可以通過  -W  命令行選項和調用  filterwarnings() 函數來覆蓋它們。

  •  DeprecationWarning  和  PendingDeprecationWarning  和  ImportWarning  被默認忽略。
  • 除非 -b 選項給出一次或兩次,否則忽略  BytesWarning ;在這種情況下,此警告或者被輸出(-b)或者變成異常(-bb)。
  • 除非 Python 是在調試模式下構建的,否則將忽略 ResourceWarning 。

在 3.2 版中的調整: 除  PendingDeprecationWarning  之外,默認情況下將忽略 DeprecationWarning 

可用函數

①warn

warnings.warn(message, category=None, stacklevel=1, source=None)

觸發異常。 category 參數默認為  UserWarning 。 message參數為警告消息,可以是 Warning 實例,在這種情況下,將忽略 category  並使用  message.__class__ ,消息文本則為 str(message) 。

這是  warn()函數的低級接口,明確傳遞消息,類別,文件名和行號,以及可選的模塊名稱和注冊表(應該是模塊的 __warningregistry__  字典)

②showwarning

warnings.showwarning(message, category, filename, lineno, file=None, line=None)

寫入警告到文件。默認調用  formatwarning(message, category, filename, lineno, line)  並將結果字符串寫入 file,默認為 sys.stderr。 line 是包含在警告消息中的一行源代碼;如果未提供則嘗試讀取由 filename 和 lineno 指定的行。

③formatwarning

warnings.formatwarning(message, category, filename, lineno, line=None)

格式化警告,返回一個字符串。可能包含嵌入的換行符,並以換行符結束。 line 是包含在警告消息中的一行源代碼;如果不提供則嘗試讀取由 filename 和 lineno 指定的行。

④filterwarnings

warnings.filterwarnings(action, message='', category=Warning, module='', lineno=0, append=False)

過濾警告,在 警告過濾器規則 列表中插入一個條目。默認情況下,條目插入在前面;如果 append 為真,則在末尾插入。它檢查參數的類型,編譯 message 和 module 的正則表達式,並將它們作為警告過濾器列表中的元組插入。如果多個地方都匹配特定的警告,那么更靠近列表前面的條目會覆蓋列表中后面的條目,省略的參數默認為匹配一切的值。

⑤simplefilter

warnings.simplefilter(action, category=Warning, lineno=0, append=False)

簡單易用的過濾器,類似 filterwarnings() 函數,但是不需要正則表達式。

⑥resetwarnings

warnings.resetwarnings()

重置警告過濾器。這會丟棄所有以前對 filterwarnings()調用的影響,包括  -W  命令行選項和對 simplefilter()的調用的影響。

可用的上下文管理器

class warnings.catch_warnings(*, record=False, module=None)

捕獲警告,在退出上下文時恢復警告過濾器和 showwarning() 函數功能。如果 record 參數是 False (缺省值),則上下文管理器在入口處返回 None。如果 record 是 True,則返回一個列表,該列表元素為 showwarning() 函數所見的對象,列表中的每個元素都具有與 showwarning() 的參數具有相同名稱的屬性。

import warnings
 
warnings.simplefilter("always")
 
def fxn():
    warnings.warn("this is a warning", Warning)
 
with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    fxn()
 
with warnings.catch_warnings(Warning):
    warnings.warn("this is a warning2", Warning)
 
warnings.warn("this is a warning3", Warning)
 
def fxn2():
    warnings.warn("deprecated", DeprecationWarning)
 
with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")
    # Trigger a warning.
    fxn2()
    # Verify some things
    assert len(w) == 1
    assert issubclass(w[-1].category, DeprecationWarning)
    assert "deprecated" in str(w[-1].message)

可以從命令行通過傳遞  -Wd  參數到解釋器(即為 -W default 的速記)。這將為所有警告啟用默認處理,包括默認情況下忽略的警告。要更改遇到的警告所采取的操作,只需更改傳遞給 -W 的參數即可,如 -W error。可以用 python --help 來查看 -W 參數的詳細使用。

在代碼中實現  -Wd  的功能為:

warnings.simplefilter('default')

這樣的代碼應該在程序開始被執行,否則有些警告可能仍然會被觸發。

 

通過警告過濾器進行控制忽略發出警告消息:

代碼如下:

import warnings
warnings.filterwarnings('ignore')

命令行下的運行代碼為:

python -W ignore file.py

命令行運行方式控制警告消息的輸出:

$ python -W all     # 輸出所有警告,等同於設置warnings.simplefilter('always')
$ python -W ignore # 忽略所有警告,等同於設置warnings.simplefilter('ignore')
$ python -W error # 將所有警告轉換為異常,等同於設置warnings.simplefilter('error')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM