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__?第一个存储在哪里?
如何在不重新启动 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上显示警告,但如果您只想查看除以零警告,请将参数从 更改all为divide。
接下来,我们更改warnings模块始终显示警告的方式。我们通过设置警告过滤器来做到这一点。
第一次警告和第二次警告有什么区别?为什么只有第二个存储在这个 __warningregistry__ 中?第一个存储在哪里?
报告此问题的错误报告对此进行了描述:
如果您在使用简单过滤器之前没有发出警告,那么这会起作用。不良行为是由于 __warningsregistry__ 造成的。它是在第一次发出警告时设置的。当第二个警告出现时,过滤器甚至不会被查看。我认为解决此问题的最佳方法是在使用过滤器时使 __warningsregistry__ 无效。最好将警告数据存储在全局 then 而不是模块上,这样很容易失效。
顺便说一句,该错误已在 3.4 和 3.5 版本中修复并关闭。