为什么Python的filterwarning模块正则表达式不能按预期工作?

blu*_*e10 5 python warnings

根据Python警告文档, filterwarnings模式是action:message:category:module:line,并且该module部分应该允许根据正则表达式匹配特定模块。我试图让这项工作来过滤第三方库模块的特定警告,但该功能似乎不起作用。

最小的例子

重现问题的更简单方法是创建一个文件

my_module.py

print("\d")
Run Code Online (Sandbox Code Playgroud)

然后PYTHONWARNINGS="error,ignore:::.*" python -c "import my_module"从同一目录运行。显然,正则表达式.*应该与模块名称匹配my_module,但不知何故却没有。问题是为什么?

原始示例

举个例子:导入包(机器人操作系统(ROS)rosbag发行版附带的一些包)在“严格”report-warnings-as-errors 模式下运行时会触发错误:

print("\d")
Run Code Online (Sandbox Code Playgroud)

这是有道理的,它应该使用原始字符串文字。

现在我尝试使用模块正则表达式来消除来自rosbag模块的警告。出于示例的目的,我通过指定过滤器警告,PYTHONWARNINGS但其他方法(例如通过 pytests 设置)会导致相同的行为。

我收到以下意外行为:

  • 使用PYTHONWARNINGS='error,ignore:invalid escape sequence::'作品。当然,这会过滤所有“无效转义序列”警告。因此,让我们module在末尾添加一个正则表达式以特定于模块......
  • usingPYTHONWARNINGS='error,ignore:invalid escape sequence::rosbag.*'应该完全做到这一点,但过滤器似乎不匹配。警告仍然被报告为错误,就像普通的一样error
  • 即使PYTHONWARNINGS='error,ignore:::.*'理论上应该匹配任何模块的 using 也无法匹配。仅像匹配一样完全删除正则表达式PYTHONWARNINGS='error,ignore:::',但当然这本质上相当于只是PYTHONWARNINGS='ignore'.

任何想法为什么模块正则表达式根本不匹配?!这是 Python 发行版的错误吗?我使用的是 Python 3.8.10 / Ubuntu 20.04。

yut*_*t23 7

从 Python 3.10 开始,这是预期的行为。警告过滤器通过设置-WPYTHONWARNINGS当前仅匹配消息和模块的文字字符串。

这是 Python 文档中的一个已知差异,并在此 CPython 问题中进行了跟踪。有一些讨论和PR来添加正则表达式支持,但最终没有结果。此公开 PR进一步澄清了文档。