为啥我不能使用 warnings.filterwarnings 使用正则表达式来抑制警告

Posted

技术标签:

【中文标题】为啥我不能使用 warnings.filterwarnings 使用正则表达式来抑制警告【英文标题】:why I cannot suppress warning with regex using warnings.filterwarnings为什么我不能使用 warnings.filterwarnings 使用正则表达式来抑制警告 【发布时间】:2017-01-13 12:34:27 【问题描述】:

我想使用正则表达式抑制特定类型的警告。 警告信息是:

C:\Anaconda3\lib\site-packages\pandas\core\indexing.py:420: SettingWithCopyWarning:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
self.obj[item] = s

我抑制过滤器的方式:

import warnings
warnings.filterwarnings("ignore", message= ".*A value is trying to.*")

但是,它失败了。我确实尝试将警告消息的不同部分粘贴到正则表达式中,但仍然失败。我想知道为什么。

【问题讨论】:

您确定在实际发出警告之前设置了警告过滤器吗? 我正在使用 Jupyter Notebook。我确定我先执行了过滤器的单元格,然后执行了另一个具有实际逻辑的单元格。仍然是一个警告, 【参考方案1】:

您的正则表达式与the correct message string 不匹配。

r".*A Value is trying to.*" 不匹配 "\nA value is trying to be.*" 因为r"." 匹配所有内容除了换行符

有时,如果不查看生成警告的模块的源代码,就很难弄清楚实际的消息字符串是什么。

【讨论】:

【参考方案2】:

这不是 filterwarnings 的工作方式。在文档中您可以看到Omitted arguments default to a value that matches everything.,也可以看到:message (default '') : is a string containing a regular expression that start of the warning message must match

这可以理解为使用action“once”会影响每条唯一的短信显示一次。如果您在消息中有可能更改的字段(例如文件名),则警告将显示每个文件名一次

如果您设置消息参数,则每个匹配的唯一文本消息将显示一次。

这是一个小例子:

import warnings
import random

warnings.filterwarnings("ignore", category=UserWarning)
warnings.warn("You won't see this warning")

message_formater = "this message with number  will be displayed once"

# deactivating previously created filter
warnings.resetwarnings()
# applying new filter
warnings.filterwarnings("once", message_formater.format("(.*)"), category=UserWarning)

for i in range(100):
    warnings.warn(message_formater.format(random.randint(0, 3)))
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:8: UserWarning: this message with number 0 will be displayed once

/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:8: UserWarning: this message with number 3 will be displayed once

/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:8: UserWarning: this message with number 1 will be displayed once

/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:8: UserWarning: this message with number 2 will be displayed once

【讨论】:

虽然不是 OP 的答案,但这正是我遇到的问题。文档不是很清楚所有唯一消息将至少打印一次,除非它们被完全忽略。警告通常具有动态文本,因此能够抑制除第一条与正则表达式匹配的消息之外的所有消息。【参考方案3】:

尝试仅提供以下代码(不带消息)。可能是您提到的消息与警告不匹配。

导入警告 warnings.filterwarnings("忽略")

【讨论】:

以上是关于为啥我不能使用 warnings.filterwarnings 使用正则表达式来抑制警告的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能使用开机功能?

为啥我不能使用 AsyncMethodCaller?

为啥我不能使用 composer 创建 Laravel 项目?

为啥我不能在这里使用 mockResolvedValue?

为啥我不能使用 RijndaelManaged 解密数据?

为啥我不能使用命令前缀?