如何完全重置警告

Pek*_*kka 4 python warnings numpy pandas

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

例如考虑以下代码:

import pandas as pd  
pd.Series([1]) / 0
Run Code Online (Sandbox Code Playgroud)

我明白了

RuntimeWarning: divide by zero encountered in true_divide 
Run Code Online (Sandbox Code Playgroud)

但当我再次运行它时,它会默默执行。

如何在不重新启动 python 的情况下再次看到警告?


我尝试过做

del __warningregistry__
Run Code Online (Sandbox Code Playgroud)

但这没有帮助。

似乎只存储了某些类型的警告。例如,如果我这样做:

def f():   
    X = pd.DataFrame(dict(a=[1,2,3],b=[4,5,6]))
    Y = X.iloc[:2]
    Y['c'] = 8
Run Code Online (Sandbox Code Playgroud)

那么这只会在第一次f()调用时发出警告。但是,现在什么时候del __warningregistry__我才能再次看到警告。


第一次警告和第二次警告有什么区别?为什么只有第二个存储在其中__warningregistry__?第一个存储在哪里?

And*_*ndy 5

如何在不重新启动 python 的情况下再次看到警告?

只要您在脚本开头执行以下操作,就无需重新启动。

import pandas as pd
import numpy as np
import warnings
np.seterr(all='warn')
warnings.simplefilter("always")
Run Code Online (Sandbox Code Playgroud)

此时每次尝试除以零时,都会显示

RuntimeWarning: divide by zero encountered in true_divide 
Run Code Online (Sandbox Code Playgroud)

解释:

我们正在设置几个警告过滤器。第一个 ( np.seterr) 告诉 NumPy 应如何处理警告。我已将其设置为在all上显示警告,但如果您只想查看除以零警告,请将参数从 更改alldivide

接下来,我们更改warnings模块始终显示警告的方式。我们通过设置警告过滤器来做到这一点。

第一次警告和第二次警告有什么区别?为什么只有第二个存储在这个 __warningregistry__ 中?第一个存储在哪里?

报告此问题的错误报告对此进行了描述:

如果您在使用简单过滤器之前没有发出警告,那么这会起作用。不良行为是由于 __warningsregistry__ 造成的。它是在第一次发出警告时设置的。当第二个警告出现时,过滤器甚至不会被查看。我认为解决此问题的最佳方法是在使用过滤器时使 __warningsregistry__ 无效。最好将警告数据存储在全局 then 而不是模块上,这样很容易失效。

顺便说一句,该错误已在 3.4 和 3.5 版本中修复并关闭。