关于python:Python警告控制模块warnings

32次阅读

共计 4224 个字符,预计需要花费 11 分钟才能阅读完成。

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 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')

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

正文完
 0