python warning模块,Python warning
Python通过调用warnings模块中定义的warn()函数来发出警告。
警告信息通常用于提醒用户一些错误或过时的用法。当这些情况发生时,我们不想抛出异常或者直接退出程序。
通常将警告消息写入sys.stderr,将信息输出到标准错误,处理警告的方式可以灵活改变,比如忽略或者变成异常。
根据警告的类别、警告消息的文本和警告消息的来源位置,对警告的处理会有所不同。通常禁止对相同的源位置重复特定的警告。
预警控制分为两个阶段:一是当预警触发时,确定是否要发送消息(预警过滤);接下来,如果要发送消息,使用用户可设置的钩子来格式化和打印消息。
警告过滤器可用于控制是否发出警告信息。警告过滤器是匹配规则和操作的序列。您可以通过调用filterwarnings()向筛选器添加规则,并通过调用resetwarnings()将其重置为默认状态。
警告信息的输出是通过调用showwarning()函数完成的,可以覆盖;此函数的默认实现通过调用formatwarning()来格式化消息,自定义实现也可以使用format warning()。
警告类别内置警告类型:
自定义警告类型可以通过继承内置警告类型来实现,内置警告类型必须始终是警告类的子类。
例如:[输出警告信息]
导入警告
Warnings.warn(这是一条自定义警告消息,category=UserWarning)运行结果:
警告筛选器[warnings . filter warnings( ignore )]警告筛选器用于控制警告消息的行为,如忽略、显示或将其转换为错误(引发异常)。
警告过滤器维护过滤规则的有序列表,匹配规则用于确定如何处理警告。任何特定的警告将依次与列表中的每个过滤规则进行匹配,直到找到匹配项。
过滤规则类型为元组(动作、消息、类别、模块、行号);
其中包括:
动作值如下:
Message是包含正则表达式的字符串,警告消息的开头必须匹配。类别是警告类型(它必须是警告的子类)。module是一个包含模块名称的正则表达式字符串,区分大小写的lineno是一个整数,出现警告的行号,如果为0,则匹配所有行号。默认警告过滤器默认情况下,Python设置了几个警告过滤器,可以通过-W命令行选项和调用filterwarnings()函数来覆盖这些过滤器。
默认情况下,忽略DeprecationWarning和PendingDeprecationWarning以及ImportWarning。BytesWarning除非给定一次或两次-b选项,否则将被忽略;在这种情况下,该警告要么输出(-b),要么变得异常(-bb)。除非Python是在调试模式下构建的,否则ResourceWarning将被忽略。3.2版本中的调整:除了PendingDeprecationWarning,默认情况下会忽略DeprecationWarning。
可用功能警告
warns . warn(message,category=none,stacklevel=1,source=none)触发异常。category参数默认为UserWarning。message参数是警告消息,可以是警告实例。在这种情况下,类别将被忽略,消息。__class__将被使用,消息文本将是str(message)。
这是warn()函数的底层接口,它显式传递消息、类别、文件名和行号,以及可选的模块名和注册表(应该是模块的__warningregistry__字典)。
显示警告
向文件中写入一个警告。默认情况下调用格式警告(消息、类别、文件名、行号、行),并将结果字符串写入文件,默认情况下该文件为sys.stderr。Line是包含在警告消息中的一行源代码;如果没有,尝试读取由文件名和行号指定的行。
格式警告
Warnings.formatWarning(消息,类别,文件名,行号,line=none)格式化警告并返回一个字符串。可能包含嵌入的换行符,并以换行符结尾。Line是包含在警告消息中的一行源代码;如果没有,尝试读取由文件名和行号指定的行。
过滤器警告
Warnings.filterwarnings (action,message= ,category=warning,module= ,lineno=0,append=false)筛选警告,并在警告筛选规则列表中插入一个条目。默认情况下,条目插入前面;如果append为true,则在末尾插入。它检查参数的类型,编译消息和模块的正则表达式,并将它们作为元组插入警告过滤器列表。如果一个特定的警告在多个地方匹配,靠近列表前面的条目将覆盖列表中后面的条目,缺省情况下,省略的参数将是匹配所有内容的值。
简单过滤器
一个简单易用的过滤器,类似于filterwarnings()函数,但是没有正则表达式。
重置警告
Warnings.resetwarnings()重置警告过滤器。这将放弃之前对filterwarnings()调用的所有影响,包括-W命令行选项和对simplefilter()的调用。
您可以使用上下文管理器classwarnings.catch _ warnings (*,record=false,module=none)来捕获警告,并在退出上下文时恢复警告过滤器和showwarning()函数。如果记录参数为False(默认值),上下文管理器在入口处返回None。如果record为True,则返回一个列表,其元素是showwarning()函数看到的对象。列表中的每个元素都有一个与showwarning()的参数同名的属性。
导入警告
warnings.simplefilter(always )
def fxn():
warnings.warn(这是一个警告,警告)
with warnings.catch_warnings():
warnings . simple filter(“ignore”)
fxn()
带有警告。catch_warnings(警告):
warnings.warn(这是一个警告2 ,警告)
warnings.warn(这是一个警告3 ,警告)
def fxn2():
warnings.warn(deprecated ,DeprecationWarning)
with warnings . catch _ warnings(record=True)为w:
#使所有警告总是被触发。
warnings.simplefilter(always )
#触发警告。
fxn2()
#验证一些事情
断言len(w)==1
断言issubclass(w[-1])。类别,弃用警告)
在str (w [-1]中断言“已弃用”。message)可以从命令行将-Wd参数传递给解释器(也就是-W default的简写)。这将为所有警告启用默认处理,包括那些默认忽略的警告。要更改遇到警告时采取的操作,只需更改传递给-W的参数,如-W error。您可以使用python - help查看-W参数的详细用法。
代码中实现-Wd的功能有:
像warnings.simplefilter(default )这样的代码应该在程序开始时执行,否则仍然会触发一些警告。
通过警告过滤器控制忽略警告消息:代码如下:
导入警告
warnings . filter warnings( ignore )命令行下的运行代码是:
python -W ignore file.py命令行操作模式控制警告消息的输出:$ python -W all #输出所有警告,相当于设置warnings.simplefilter(always )。
$ python -W ignore #忽略所有警告等同于设置warnings.simplefilter(ignore )
$ python -W error #将所有警告转换为异常,这相当于设置warnings.simplefilter(error )
期待陌生,拥抱惊喜。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。