前言

这两天开始学习机器学习,在完成鸢尾花数据集的模型建立的时候,报出来一大堆的FutureWarning,虽然不影响数据,但是看着十分碍眼,所以使用Wainings模块将其屏蔽掉:

from warnings import simplefilter
# 使用 warnings 抑制第三方警告
simplefilter(action='ignore', category=FutureWarning)
warnings.filterwarnings('ignore')

这里详细介绍一下Warnings模块:

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)

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

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 thingsassert len(w) == 1assert 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')

这样的代码应该在程序开始被执行,否则有些警告可能仍然会被触发。

部分内容来自:旷世的忧伤

Python报错日志:Warnings模块简介相关推荐

  1. Python打印详细报错日志,获取报错信息位置行数

    源于: 功能类代码 – Logsetclass.py 网上代码1: # 日志模块 import logging import traceback# 引入日志 logging.basicConfig(f ...

  2. python 报错 AttributeError: type object ‘datetime.datetime‘ has no attribute ‘datetime‘

    python报错:type object 'datetime.datetime' has no attribute 'datetime' 描述:在第一个python程序里还未报错,第二个程序完全复制过 ...

  3. Python报错处理libpng warning: iCCP: cHRM chunk does not match sRGB

    Python报错处理libpng warning: iCCP: cHRM chunk does not match sRGB 代码 报错如下 正常使用matplotlib模块对数据进行绘图,结果发现报 ...

  4. Python报错:NameError: name 'reduce' is not defined 和 reduce()函数介绍

    Python报错:NameError: name 'reduce' is not defined 1. 解决报错: 从 functools 模块中导入 reduce 函数: from functool ...

  5. pycharm/python报错:Traceback (most recent call last): .....

    python报错:Traceback (most recent call last): - python报错: Traceback (most recent call last):File " ...

  6. python 报错 IndentationError: expected an indented block SyntaxError: invalid character in identifie

    红色方框那里敲击一个空格就好! 输入要在全英情况下! 另外,还要注意括号的事情.括号别出错误! IndentationError: expected an indented block的报错: Syn ...

  7. Python安装库较慢问题,Python报错pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool解决方法

    本文参考:https://blog.csdn.net/sinat_26811377/article/details/99698807 出现问题 在安装第三方库的时候,Python报错pip._vend ...

  8. 解决Python报错UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 658: illegal multibyte

    解决Python报错–UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 658: illegal multibyte ...

  9. python报错UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe8 in position 0 解决方案

    python报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 0 解决方案 参考文章: (1)python报 ...

最新文章

  1. Java中创建线程需要使用的类_如何通过使用Java中的匿名类创建线程?
  2. QIIME 2教程. 32如何写方法和引用Citing(2021.2)
  3. svn update -r m path 代码还原到某个版本(这样之前的log日志也就没了,也就是清空log日志)...
  4. 并联系统的失效率公式推导_供暖系统水力平衡率对室温的影响
  5. 工作4年工资8K,还有什么理由不努力?
  6. 脸书推出VR视频会议应用程序 正式跨出元宇宙第一步;三家公司新入选福布斯2021云计算百强榜;微软挖来亚马逊云业务顶级高管贝尔...
  7. java导入项目存在,如何将预先存在的Java项目导入Eclipse并启动并运行?
  8. linux内核设计与实现 怎么读,《Linux内核设计与实现》CHAPTER1,2阅读梳理
  9. 使用ef core自动生成mysql表和数据编码的问题
  10. (原創) 如何在Ubuntu上啟動ADSL連線? (OS) (Linux) (Ubuntu)
  11. JS高程5.引用类型(6)Array类型的位置方法,迭代方法,归并方法
  12. 当R用户用ggplot2 package时,经常问的10个问题
  13. Python实现Mean Shift聚类算法
  14. 工业生产管理-数据采集初探
  15. 关于MVC控制器导出Excel时MemoryStream流已关闭的问题
  16. linux下查看手机芯片,如何查看手机闪存型号
  17. 【转载】SystemVerilog中子程序调用与参数传递(ref关键字)
  18. 计算机怎么设置内存数据恢复,电脑内存不足如何清理?误删除文件怎么恢复?...
  19. python中除法(/)、取模(%)、取整除(//)、幂(**)运算
  20. 实验室lims系统流程是怎么样的?

热门文章

  1. Everything研究之读取NTFS下的USN日志文件(1)
  2. 最全的 explain解释
  3. iVMS-4200 Vs区别_理科与工科有什么区别?如何判断自己适合学那个?
  4. 微信小程序开发笔记 进阶篇④——getPhoneNumber 获取用户手机号码(小程序云)
  5. 给大家分享几个强度很高又很好记的密码
  6. 鸿蒙EMUI10升级体验,华为P30升级EMUI10,体验如何?我给大家说一说!
  7. 广告术语(持续更新...)
  8. HIT信息安全概论复习:1~10
  9. 种子的“选择”可影响地区生物多样性
  10. ppspp android编译,PPSSPP Windows和Android更新版本至1.1~~