Python 通过调用 warnings 模块中定义的 warn() 函数来收回正告。正告音讯通常用于提醒用户一些谬误或者过期的用法,当这些状况产生时咱们不心愿抛出异样或者间接退出程序。正告音讯通常写入 sys.stderr,对正告的解决形式能够灵便的更改,例如疏忽或者转变为为异样。正告的解决能够依据正告类别,正告音讯的文本和收回正告音讯的源地位而变动。对雷同源地位的特定正告的反复通常被克制。

正告管制分为两个阶段:首先,正告被触发时,确定是否应该收回音讯;接下来,如果要收回音讯,则应用用户可设置的钩子来格式化和打印消息。

正告过滤器能够用来管制是否收回正告音讯,正告过滤器是一些匹配规定和动作的序列。能够通过调用 filterwarnings() 将规定增加到过滤器,并通过调用 resetwarnings() 将其重置为默认状态。

正告音讯的输入是通过调用 showwarning() 函数来实现的,其能够被笼罩;该函数的默认实现通过调用 formatwarning() 格式化音讯,这也能够由自定义实现应用。

正告类别

內建正告类型:

形容
Warning所有正告类别类的基类,它是 Exception 的子类
UserWarning函数 warn() 的默认类别
DeprecationWarning用于已弃用性能的正告(默认被疏忽)
SyntaxWarning用于可疑语法的正告
RuntimeWarning用于无关可疑运行时性能的正告
FutureWarning对于将来个性更改的正告
PendingDeprecationWarning对于将来会被弃用的性能的正告(默认将被疏忽)
ImportWarning导入模块过程中触发的正告(默认被疏忽)
UnicodeWarning与 Unicode 相干的正告
BytesWarning与 bytes 和 bytearray 相干的正告 (Python3)
ResourceWarning与资源应用相干的正告(Python3)

能够通过继承內建正告类型来实现自定义的正告类型,正告类型必须始终是 Warning 类的子类。

正告过滤器

正告过滤器用于管制正告的行为,如疏忽,显示或转换为谬误(引发异样)。正告过滤器保护着一个有序的过滤规定列表,匹配规定用于确定如何解决正告,任何特定正告都将顺次与列表中的每个过滤规定匹配,直到找到匹配为止。过滤规定类型为一个元组 (action,message,category,module,lineno),其中:

action 为以下值:

解决形式
"error"将匹配正告转换为异样
"ignore"疏忽匹配的正告
"always"始终输入匹配的正告
"default"对于同样的正告只输入第一次呈现的正告
"module"在一个模块中只输入第一次呈现的正告
"once"输入第一次呈现的正告,而不思考它们的地位
  • 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_explicit

warnings.warn_explicit(    message, category, filename,    lineno, module=None, registry=None,     module_globals=None, source=None)

这是 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)

简略易用的过滤器,相似 filterwarn ings() 函数,然而不须要正则表达式。

resetwarnings

warnings.resetwarnings()

重置正告过滤器。这会抛弃所有以前对 filterwarnings() 调用的影响,包含 -W 命令行选项和对 simplefilter() 的调用的影响。

可用的上下文管理器

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

捕捉正告,在退出上下文时复原正告过滤器和 showwarning() 函数性能。如果 record 参数是 False (缺省值),则上下文管理器在入口处返回 None。如果 record 是 True,则返回一个列表,该列表元素为 showwarning() 函数所见的对象,列表中的每个元素都具备与 showwarning() 的参数具备雷同名称的属性。

import warningswarnings.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')

最近整顿了一套编程学习材料分享给大家,全是干货内容,蕴含教程视频、电子书、源码笔记、学习路线图、实战我的项目、面试题等等,关注gzh【Python编程学习圈】就能收费获取,回复关键词【学习材料】即可,抓紧时间吧!