Python 如何完全重置警告
如何在不重新启动python的情况下再次看到警告。现在我只见过他们一次 以这段代码为例:Python 如何完全重置警告,python,pandas,numpy,warnings,Python,Pandas,Numpy,Warnings,如何在不重新启动python的情况下再次看到警告。现在我只见过他们一次 以这段代码为例: import pandas as pd pd.Series([1]) / 0 我明白了 RuntimeWarning: divide by zero encountered in true_divide 但当我再次运行它时,它会无声地执行 如何在不重新启动python的情况下再次看到警告? 我已经试过了 del __warningregistry__ 但那没用 似乎只有一些类型的警告存储在那里
import pandas as pd
pd.Series([1]) / 0
我明白了
RuntimeWarning: divide by zero encountered in true_divide
但当我再次运行它时,它会无声地执行
如何在不重新启动python的情况下再次看到警告?
我已经试过了
del __warningregistry__
但那没用
似乎只有一些类型的警告存储在那里。
例如,如果我这样做:
def f():
X = pd.DataFrame(dict(a=[1,2,3],b=[4,5,6]))
Y = X.iloc[:2]
Y['c'] = 8
然后,这将仅在调用f()
时首次发出警告。
但是,现在如果执行del\uuuu warningregistry\uuuu
操作,我可以再次看到警告
第一次警告和第二次警告的区别是什么?为什么只有第二个存储在此
警告注册表中?第一个存储在哪里
如何在不重新启动python的情况下再次看到警告
只要在脚本开始时执行以下操作,就不需要重新启动
import pandas as pd
import numpy as np
import warnings
np.seterr(all='warn')
warnings.simplefilter("always")
此时,每次尝试除以零时,它都会显示
RuntimeWarning: divide by zero encountered in true_divide
说明:
我们正在设置几个警告过滤器。第一个()告诉NumPy它应该如何处理警告。我已将其设置为显示所有警告,但如果您只想看到被零除的警告,请将参数从all
更改为Divide
接下来,我们更改希望警告
模块始终显示警告的方式。我们通过建立一个
第一次警告和第二次警告的区别是什么?为什么只有第二个存储在这个警告注册表中?第一个存储在哪里
这在本期报告中有描述:
如果在使用简单过滤器之前没有发出警告,则
那就行了。这种不受欢迎的行为是因为
__警告登记处。它是在第一次发出警告时设置的。
当第二个警告出现时,过滤器甚至没有被查看。
我认为解决这个问题的最好办法是使警告无效__
当使用过滤器时。最好存储警告数据
在全局范围内,则不在模块上,因此很容易失效
顺便说一下,对于版本3.4和3.5,已按固定方式关闭 警告
是一个非常棒的标准库模块。你会喜欢了解它:)
一点背景
warnings
的默认行为是在第一次出现时仅显示来自特定行的特定警告。例如,以下代码将导致向用户显示两个警告:
将numpy导入为np
#10个警告,但仅显示第一个副本
对于范围(10)内的i:
np.真除法(1,0)
#这与其他“副本”在单独一行,因此其警告将显示
np.真除法(1,0)
您有几个选项可以更改此行为
选项1:重置警告注册表
如果希望python“忘记”以前看到的警告,可以使用:
#每次都会发出警告,因为警告注册表已重置
对于范围(10)内的i:
警告。重置警告()
np.真除法(1,0)
请注意,这还会重置您所做的任何警告配置更改。这让我想到
选项2:更改警告配置
本文更详细地介绍了这一点,但是一个简单的选择就是使用simplefilter
来更改默认行为
导入警告
将numpy作为np导入
#显示所有警告
警告。simplefilter('always'))
对于范围(10)内的i:
#现在,这将警告每个循环
np.真除法(1,0)
由于这是一个全局配置更改,因此可能会产生您希望避免的全局影响(应用程序中任何位置的所有警告每次都会显示)。一个不太激烈的选择是使用上下文管理器:
带有警告的。捕获警告()
警告。simplefilter('always'))
对于范围(10)内的i:
#这将警告每个循环
np.真除法(1,0)
#恢复正常行为:仅警告一次
对于范围(10)内的i:
np.真除法(1,0)
还有更多细粒度选项可用于更改特定类型警告的配置。为此,请查看。是否导入警告。重置警告()
有效?否。对于第二个例子,它甚至没有帮助(谢谢,这确实有效。我只需要记住在运行任何其他操作之前指定它。如果我在运行之前收到一个警告,那么一切都是没有希望的。