python:warnings —— 警告信息的控制

Python的warnings模块提供了对警告信息的控制,包括警告类别如DeprecationWarning和FutureWarning,以及过滤器机制来决定是否显示或转换为错误。警告过滤器可以通过-W选项、PYTHONWARNINGS环境变量或filterwarnings函数进行设置。此外,可以使用logging模块捕获和处理警告,以及使用catch_warnings上下文管理器临时抑制警告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python:warnings —— 警告信息的控制


通常以下情况会引发警告:提醒用户注意程序中的某些情况,而这些情况(通常)还不值得触发异常并终止程序。例如,当程序用到了某个过时的模块时,就可能需要发出一条警告。

Python 程序员可调用本模块中定义的 warn() 函数来发布警告。(C 语言程序员则用 PyErr_WarnEx() ; 详见 异常处理 )。

警告信息通常会写入 sys.stderr ,但可以灵活改变,从忽略所有警告到变成异常都可以。警告的处理方式可以依据 警告类型 、警告信息的文本和发出警告的源位置而进行变化。同一源位置重复出现的警告通常会被抑制。

控制警告信息有两个阶段:首先,每次引发警告时,决定信息是否要发出;然后,如果要发出信息,就用可由用户设置的钩子进行格式化并打印输出。

警告过滤器 控制着是否发出警告信息,也即一系列的匹配规则和动作。调用 filterwarnings() 可将规则加入过滤器,调用 resetwarnings() 则可重置为默认状态。

警告信息的打印输出是通过调用 showwarning() 完成的,该函数可被重写;默认的实现代码是调用 formatwarning() 进行格式化,自己编写的代码也可以调用此格式化函数。

参见 利用 logging.captureWarnings() 可以采用标准的日志架构处理所有警告。

警告类别

警告的类别由一些内置的异常表示。这种分类有助于对警告信息进行分组过滤。

虽然在技术上警告类别属于 内置异常,但也只是在此记录一下而已,因为在概念上他们属于警告机制的一部分。

通过对某个标准的警告类别进行派生,用户代码可以定义其他的警告类别。 警告类别必须是 Warning 类的子类。

目前已定义了以下警告类别的类:

在这里插入图片描述

在 3.7 版更改: 以前 DeprecationWarning 和 FutureWarning 是根据某个功能是否完全删除或改变其行为来区分的。现在是根据受众和默认警告过滤器的处理方式来区分的。

警告过滤器
警告过滤器控制着警告是否被忽略、显示或转为错误(触发异常)。

从概念上讲,警告过滤器维护着一个经过排序的过滤器类别列表;任何具体的警告都会依次与列表中的每种过滤器进行匹配,直到找到一个匹配项;过滤器决定了匹配项的处理方式。每个列表项均为 ( action , message , category , module , lineno ) 格式的元组,其中:

action 是以下字符串之一:
在这里插入图片描述
message 是一个包含警告消息的开头需要匹配的正则表达式的字符串,对大小写不敏感。 在 -W 和 PYTHONWARNINGS 中,message 是警告消息的开头需要包含的字符串字面值(对大小写不敏感),将忽略 message 开头和末尾的任何空格。

category 是警告类别的类(Warning 的子类),警告类别必须是其子类,才能匹配。
由于 Warning 类是由内置类 Exception 派生出来的,要把某个警告变成错误,只要触发category(message) 即可。

如果警告不匹配所有已注册的过滤器,那就会应用 “default” 动作

### 解决 Python 中 libpng 警告问题 当使用 `libpng` 库处理 PNG 图像时,可能会遇到如下警告:`libpng warning: iCCP: known incorrect sRGB profile`[^1]。此警告通常是因为图像文件中的色彩配置文件存在问题。 #### 方法一:忽略警告信息 如果这些警告不影响程序的功能实现,可以选择简单地抑制它们。对于 Python 用户来说,在脚本开头加入以下代码可以有效屏蔽此类警告: ```python import warnings warnings.filterwarnings("ignore", category=UserWarning, module='pygame') ``` 这种方法适用于那些不希望被无关紧要的消息干扰的情况,但请注意这仅能隐藏消息而不会修正潜在的问题[^2]。 #### 方法二:修复原始图片 更彻底的办法是对引起问题的 PNG 文件本身进行修改。一种方式是利用图形编辑软件重新保存受影响的图片;另一种更为自动化的方式是在代码里通过 Pillow 或其他支持 ICC 配置文件操作的库来调整并重写图片数据。下面是一个基于 Pillow 的例子: ```python from PIL import Image img = Image.open('problematic_image.png') # 打开有问题的图片 metadata = img.info.copy() # 复制元数据 if 'icc_profile' in metadata: del metadata['icc_profile'] # 删除错误的颜色配置文件条目 img.save('fixed_image.png', **metadata) # 另存为新文件 ``` 这段代码会移除掉可能引发警告的颜色配置部分,并创建一个新的不含该属性的副本[^3]。 #### 方法三:转换图片格式 有时最简单的解决方案就是改变输入素材的形式——即把原来的 PNG 格式的资源转成 JPEG 等不受这个问题影响的格式再加以运用。不过这样做之前应当权衡好质量损失与否以及项目需求之间的关系[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FuncPlotCalc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值