如何使用Python的warnings模块过滤特定警告?

2026-05-24 17:402阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2064个文字,预计阅读时间需要9分钟。

如何使用Python的warnings模块过滤特定警告?

前言通过Python调用warnings模块中定义的warn函数来发出警告。警告消息通常用于提示用户一些错误或过时的用法,当这些情况发生时,我们通常不希望抛出异常或直接退出程序。

警语警告消息可以通过以下方式发出:- 使用`warnings.warn()`函数,传递一条警告信息。

示例代码:pythonimport warnings

def warn(): warnings.warn(这是一个警告信息,用于提示用户某些错误或过时的用法。)

warn()

前言

①Python通过调用warnings 模块中定义的warn() 函数来发出警告。

②警告消息通常用于提示用户一些错误或者过时的用法,当这些情况发生时我们不希望抛出异常或者直接退出程序。

③警告消息通常写入sys.stderr向标准错误输出信息,对警告的处理方式可以灵活的更改,例如忽略或者转变为为异常。

④警告的处理可以根据警告类别,警告消息的文本和发出警告消息的源位置而变化。对相同源位置的特定警告的重复通常被抑制。

如何使用Python的warnings模块过滤特定警告?

⑤警告控制分为两个阶段:首先,警告被触发时,确定是否应该发出消息(警告过滤器);接下来,如果要发出消息,则使用用户可设置的钩子来格式化和打印消息。

⑥警告过滤器可以用来控制是否发出警告消息,警告过滤器是一些匹配规则和动作的序列。可以通过调用filterwarnings()将规则添加到过滤器,并通过调用resetwarnings()将其重置为默认状态。

⑦警告消息的输出是通过调用showwarning() 函数来完成的,其可以被覆盖;该函数的默认实现通过调用formatwarning() 格式化消息,这也可以由自定义实现使用。

警告类别

內建警告类型:

可以通过继承內建警告类型来实现自定义的警告类型,警告类型必须始终是​​Warning​​类的子类。

例如:

import warnings

warnings.warn('这是自定义的警告消息', category=UserWarning)

运行结果:

警告过滤器

警告过滤器用于控制警告消息的行为,如忽略,显示或转换为错误(引发异常)。

警告过滤器维护着一个有序的过滤规则列表,匹配规则用于确定如何处理警告,任何特定警告都将依次与列表中的每个过滤规则匹配,直到找到匹配为止。

过滤规则类型为一个元组 (action,message,category,module,lineno);

其中:

  • action为以下值:

  • 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()函数的低级接口,明确传递消息,类别,文件名和行号,以及可选的模块名称和注册表(应该是模块的__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)

简单易用的过滤器,类似filterwarnings()函数,但是不需要正则表达式。

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

命令行下的运行代码为:

python -W ignore file.py

命令行运行方式控制警告消息的输出:

$ python -W all # 输出所有警告,等同于设置warnings.simplefilter('always')

$ python -W ignore # 忽略所有警告,等同于设置warnings.simplefilter('ignore')

$ python -W error # 将所有警告转换为异常,等同于设置warnings.simplefilter('error')

去期待陌生,去拥抱惊喜。

本文共计2064个文字,预计阅读时间需要9分钟。

如何使用Python的warnings模块过滤特定警告?

前言通过Python调用warnings模块中定义的warn函数来发出警告。警告消息通常用于提示用户一些错误或过时的用法,当这些情况发生时,我们通常不希望抛出异常或直接退出程序。

警语警告消息可以通过以下方式发出:- 使用`warnings.warn()`函数,传递一条警告信息。

示例代码:pythonimport warnings

def warn(): warnings.warn(这是一个警告信息,用于提示用户某些错误或过时的用法。)

warn()

前言

①Python通过调用warnings 模块中定义的warn() 函数来发出警告。

②警告消息通常用于提示用户一些错误或者过时的用法,当这些情况发生时我们不希望抛出异常或者直接退出程序。

③警告消息通常写入sys.stderr向标准错误输出信息,对警告的处理方式可以灵活的更改,例如忽略或者转变为为异常。

④警告的处理可以根据警告类别,警告消息的文本和发出警告消息的源位置而变化。对相同源位置的特定警告的重复通常被抑制。

如何使用Python的warnings模块过滤特定警告?

⑤警告控制分为两个阶段:首先,警告被触发时,确定是否应该发出消息(警告过滤器);接下来,如果要发出消息,则使用用户可设置的钩子来格式化和打印消息。

⑥警告过滤器可以用来控制是否发出警告消息,警告过滤器是一些匹配规则和动作的序列。可以通过调用filterwarnings()将规则添加到过滤器,并通过调用resetwarnings()将其重置为默认状态。

⑦警告消息的输出是通过调用showwarning() 函数来完成的,其可以被覆盖;该函数的默认实现通过调用formatwarning() 格式化消息,这也可以由自定义实现使用。

警告类别

內建警告类型:

可以通过继承內建警告类型来实现自定义的警告类型,警告类型必须始终是​​Warning​​类的子类。

例如:

import warnings

warnings.warn('这是自定义的警告消息', category=UserWarning)

运行结果:

警告过滤器

警告过滤器用于控制警告消息的行为,如忽略,显示或转换为错误(引发异常)。

警告过滤器维护着一个有序的过滤规则列表,匹配规则用于确定如何处理警告,任何特定警告都将依次与列表中的每个过滤规则匹配,直到找到匹配为止。

过滤规则类型为一个元组 (action,message,category,module,lineno);

其中:

  • action为以下值:

  • 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()函数的低级接口,明确传递消息,类别,文件名和行号,以及可选的模块名称和注册表(应该是模块的__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)

简单易用的过滤器,类似filterwarnings()函数,但是不需要正则表达式。

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

命令行下的运行代码为:

python -W ignore file.py

命令行运行方式控制警告消息的输出:

$ python -W all # 输出所有警告,等同于设置warnings.simplefilter('always')

$ python -W ignore # 忽略所有警告,等同于设置warnings.simplefilter('ignore')

$ python -W error # 将所有警告转换为异常,等同于设置warnings.simplefilter('error')

去期待陌生,去拥抱惊喜。