Python通过调用warnings模块中定义的warn()函数发出警告。警告消息通常用于提醒用户一些错误或过时的用法。当出现这些情况时,我们不想抛出异常或者直接退出程序。警告信息通常写入sys.stderr,对警告的处理可以灵活改变,如忽略或转为异常。警告的处理可能因警告类别、警告消息的文本以及发出警告消息的源位置而异。通常会禁止将特定警告重复到同一源位置。警报控制分为两个阶段:首先,当警报被触发时,确定是否应发出消息;其次,如果发出消息,则使用用户可设置的挂钩来格式化和打印消息。警告过滤器可用于控制是否发出警告消息。警告过滤器是匹配规则和操作的序列。可以通过调用filterwarnings()将规则添加到过滤器,并通过调用resetwarnings()重置为默认状态。警告信息的输出是通过调用showwarning()函数完成的,可以重写;此函数的默认实现通过调用formatwarning()来格式化消息,自定义实现也可以使用它。警告类别内置警告类型:classdescriptionWarning所有警告类别类的基类,是ExceptionUserWarning函数warn()的子类默认类别DeprecationWarning用于弃用函数的警告(默认忽略)SyntaxWarning使用用于可疑语法警告RuntimeWarning用于有关可疑运行时功能的警告FutureWarning用于未来功能更改UnicodeWarning与Unicode相关的警告BytesWarning与字节和字节数组相关的警告(Python3)ResourceWarning与资源使用相关的警告(Python3)您可以通过继承内置警告类型,警告类型必须始终是警告类的子类。WarningFilters警告过滤器用于控制警告的行为,例如忽略、显示或转换为错误(抛出异常)。警告过滤器维护过滤规则的有序列表。匹配规则用于确定如何处理警告。任何特定的警告将依次与列表中的每个过滤规则匹配,直到找到匹配项。过滤规则类型是一个元组(action,message,category,module,lineno),其中:action为以下值:值处理方法“error”将匹配的警告转换为异常“ignore”忽略匹配的警告“always”总是输出匹配warnings"default"仅输出同一警告的第一次出现"module"仅输出模块中第一次出现的警告"once"输出警告的第一次出现而不管其位置message是一个包含正则表达式的字符串必须匹配警告信息的开头,不区分大小写category是一个警告类型(必须是Warning的子类)module是包含模块名的正则表达式字符串,区分大小写lineno是一个整数,警告发生的行号,和0匹配所有行号。默认警告过滤器默认情况下,Python设置了几个警告过滤器,可以通过-W命令行选项和调用filterwarnings()函数来覆盖它们。默认情况下忽略DeprecationWarning和PendingDeprecationWarning和ImportWarning。BytesWarning被忽略,除非-b选项给出一次或两次;在这种情况下,警告要么被打印出来(-b),要么变成异常(-bb)。除非Python是在调试模式下构建的,否则ResourceWarnings将被忽略。在3.2版更改:除了PendingDeprecationWarning之外,DeprecationWarning默认会被忽略。函数warnwarnings.warn(message,category=None,stacklevel=1,source=None)可用于触发异常。类别参数默认为UserWarning。message参数为警告消息,可以是一个Warning实例,此时category被忽略,使用message.__class__,消息文本为str(message)。warn_explicitwarnings.warn_explicit(message,category,filename,lineno,module=None,registry=None,module_globals=None,source=None)这是warn()函数的低级接口,传递消息、类别、文件名和行显式编号,以及可选的模块名称和注册表(应该是模块的warningregistry字典)showwarningwarnings.showwarning(message,category,filename,lineno,file=None,line=None)将警告写入文件。默认调用formatwarning(message,category,filename,lineno,line)并将结果字符串写入文件,默认为sys.stderr。line是要包含在警告消息中的一行源代码;如果未提供,则尝试读取文件名和lineno指定的行。formatwarningwarnings.formatwarning(message,category,filename,lineno,line=None)格式警告,返回一个字符串。可能包含嵌入的换行符并以换行符结尾。line是要包含在警告消息中的一行源代码;如果未提供,则尝试读取文件名和lineno指定的行。filterwarningswarnings.filterwarnings(action,message='',category=Warning,module='',lineno=0,append=False)过滤警告,在警告过滤规则列表中插入一个条目。默认情况下,条目插入在前面;如果append为真,则将它们插入到末尾。它检查参数的类型,编译消息和模块的正则表达式,并将它们作为元组插入警告过滤器列表中。如果多个地方匹配一个特定的警告,靠近列表前面的条目会覆盖列表后面的条目,并且省略的参数默认为匹配所有内容的值。simplefilterwarnings.simplefilter(action,category=Warning,lineno=0,append=False)是一个简单易用的过滤器,类似于filterwarnings()函数,但不需要正则表达式。resetwarningswarnings.resetwarnings()重置警告过滤器。这会丢弃所有先前对filterwarnings()调用的影响,包括-W命令行选项和对simplefilter()调用的影响。可用的上下文管理器类warnings.catch_warnings(*,record=False,module=None)捕获警告,在退出上下文时恢复警告过滤器和showwarning()函数功能。如果记录参数为False(默认值),则上下文管理器在输入时返回None。如果record为True,则返回showwarning()函数看到的对象列表,列表中的每个元素都有一个与showwarning()的参数同名的属性。importwarningswarnings.simplefilter("always")deffxn():warnings.warn("thisisawarning",Warning)withwarnings.catch_warnings():warnings.simplefilter("ignore")fxn()withwarnings.catch_warnings(警告):warnings.warn("这是一个警告2",Warning)warnings.warn("这是一个警告3",Warning)deffxn2():warnings.warn("deprecated",DeprecationWarning)withwarnings.catch_warnings(record=True)asw:#始终触发所有警告。warnings.simplefilter("always")#触发警告。fxn2()#验证一些东西assertlen(w)==1sub(w-1is].category,DeprecationWarning)assert"deprecated"instr(w[-1].message)可以从命令行传递给通过传递-Wd参数(即-Wdefault的简写)解释器。这将为所有警告启用默认处理,包括默认忽略的警告。要更改对遇到的警告采取的操作,只需更改传递给-W的参数,例如-Werror。可以使用python--help查看-W参数的详细用法。代码中实现-Wd的作用是:warnings.simplefilter('default')这样的代码应该在程序的开头执行,否则还是会触发一些警告。写在最后说了这么多,其实下面两行代码是日常生活中最常用的。importwarningswarnings.filterwarnings('ignore')最近整理了一套编程学习资料分享给大家,全是干货,包括教程视频、电子书、源码笔记、学习路线图、实战项目、面试题等。关注gzh【Python编程学习圈】即可免费获取,只需回复关键词【学习资料】,抓紧时间!
