python:warnings —— 警告信息的控制
通常以下情况会引发警告:提醒用户注意程序中的某些情况,而这些情况(通常)还不值得触发异常并终止程序。例如,当程序用到了某个过时的模块时,就可能需要发出一条警告。
Python 程序员可调用本模块中定义的 warn() 函数来发布警告。(C 语言程序员则用 PyErr_WarnEx() ; 详见 异常处理 )。
警告信息通常会写入 sys.stderr ,但可以灵活改变,从忽略所有警告到变成异常都可以。警告的处理方式可以依据 警告类型 、警告信息的文本和发出警告的源位置而进行变化。同一源位置重复出现的警告通常会被抑制。
控制警告信息有两个阶段:首先,每次引发警告时,决定信息是否要发出;然后,如果要发出信息,就用可由用户设置的钩子进行格式化并打印输出。
警告过滤器 控制着是否发出警告信息,也即一系列的匹配规则和动作。调用 filterwarnings() 可将规则加入过滤器,调用 resetwarnings() 则可重置为默认状态。
警告信息的打印输出是通过调用 showwarning() 完成的,该函数可被重写;默认的实现代码是调用 formatwarning() 进行格式化,自己编写的代码也可以调用此格式化函数。
参见 利用 logging.captureWarnings() 可以采用标准的日志架构处理所有警告。
警告类别
警告的类别由一些内置的异常表示。这种分类有助于对警告信息进行分组过滤。
虽然在技术上警告类别属于 内置异常,但也只是在此记录一下而已,因为在概念上他们属于警告机制的一部分。
通过对某个标准的警告类别进行派生,用户代码可以定义其他的警告类别。 警告类别必须是 Warning 类的子类。
目前已定义了以下警告类别的类:
在 3.7 版更改: 以前 DeprecationWarning 和 FutureWarning 是根据某个功能是否完全删除或改变其行为来区分的。现在是根据受众和默认警告过滤器的处理方式来区分的。
警告过滤器
警告过滤器控制着警告是否被忽略、显示或转为错误(触发异常)。
从概念上讲,警告过滤器维护着一个经过排序的过滤器类别列表;任何具体的警告都会依次与列表中的每种过滤器进行匹配,直到找到一个匹配项;过滤器决定了匹配项的处理方式。每个列表项均为 ( action , message , category , module , lineno ) 格式的元组,其中:
action 是以下字符串之一:
message 是一个包含警告消息的开头需要匹配的正则表达式的字符串,对大小写不敏感。 在 -W 和 PYTHONWARNINGS 中,message 是警告消息的开头需要包含的字符串字面值(对大小写不敏感),将忽略 message 开头和末尾的任何空格。
category 是警告类别的类(Warning 的子类),警告类别必须是其子类,才能匹配。
由于 Warning 类是由内置类 Exception 派生出来的,要把某个警告变成错误,只要触发category(message)
即可。
如果警告不匹配所有已注册的过滤器,那就会应用 “default” 动作