如何检查Python中Warnings Filter的当前状态?
Python查看警告过滤器当前状态的方法
Python的warnings模块会将所有生效的过滤规则存储在内置的公开列表属性中,直接读取即可获取完整配置:
1. 直接读取warnings.filters列表
这是最直接的方法,所有通过warnings.simplefilter添加、PYTHONWARNINGS环境变量配置、-W命令行参数传入的规则,最终都会合并到这个有序列表中,过滤时会按列表顺序从前到后匹配。
列表中每一项是固定结构的元组:(action, message, category, module, lineno),各字段含义如下:
action:警告触发后的处理动作,常见取值包括error(转为异常抛出)、ignore(直接忽略)、always(每次触发都打印)、default(同一位置首次触发打印)、module(同一模块首次触发打印)、once(全程序仅打印一次)message:匹配警告内容的正则表达式对象,空代表匹配所有内容category:匹配的警告类,比如DeprecationWarning、UserWarning等module:匹配触发警告的模块名的正则表达式对象,空代表匹配所有模块lineno:匹配触发警告的代码行号,0代表匹配所有行
示例代码:
import warnings from pprint import pprint # 打印当前所有生效的警告过滤规则 pprint(warnings.filters)
2. 输出可读性更强的规则说明
如果需要更直观的说明,可以自己封装简单的解析函数,示例如下:
import warnings def print_warnings_filters(): action_desc = { "error": "转为异常抛出", "ignore": "直接忽略", "always": "每次触发都打印", "default": "同一位置首次触发打印", "module": "同一模块首次触发打印", "once": "全程序仅打印一次" } for i, rule in enumerate(warnings.filters, 1): action, msg_re, cat, mod_re, lineno = rule print(f"=== 第{i}条规则 ===") print(f"处理动作:{action_desc.get(action, action)}") print(f"匹配警告类型:{cat.__name__}") print(f"匹配警告内容正则:{msg_re.pattern if msg_re else '无(匹配所有)'}") print(f"匹配模块正则:{mod_re.pattern if mod_re else '无(匹配所有)'}") print(f"匹配行号:{'所有行' if lineno == 0 else lineno}") print() print_warnings_filters()
内容的提问来源于stack exchange,提问作者Jasha
相关产品推荐
相关产品推荐

