Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何完全重置警告_Python_Pandas_Numpy_Warnings - Fatal编程技术网

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__ 但那没用 似乎只有一些类型的警告存储在那里

如何在不重新启动python的情况下再次看到警告。现在我只见过他们一次

以这段代码为例:

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)

还有更多细粒度选项可用于更改特定类型警告的配置。为此,请查看。

是否导入警告。重置警告()
有效?否。对于第二个例子,它甚至没有帮助(谢谢,这确实有效。我只需要记住在运行任何其他操作之前指定它。如果我在运行之前收到一个警告,那么一切都是没有希望的。