如何在不重新启动 python 的情况下再次看到警告。现在我只见到他们一次。
例如考虑以下代码:
import pandas as pd
pd.Series([1]) / 0
I get
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 __warningregistry__
我可以再次看到警告。
第一次警告和第二次警告有什么区别?为什么这里只存储第二个__warningregistry__
?第一个存储在哪里?
如何在不重新启动 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
解释:
我们正在设置几个警告过滤器。首先 (np.seterr http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html) 告诉 NumPy 应如何处理警告。我已将其设置为显示警告all,但如果您只想查看除以零警告,请将参数从all
to divide
.
接下来我们改变我们想要的方式warnings
模块始终显示警告。我们通过设置一个警告过滤器 https://docs.python.org/2/library/warnings.html#the-warnings-filter.
第一次警告和第二次警告有什么区别?为什么只有第二个存储在这个 __warningregistry__ 中?第一个存储在哪里?
这在错误报告 https://bugs.python.org/msg75117报告此问题:
如果您在使用简单过滤器之前没有发出警告,则这
会起作用的。不良行为是因为
__警告注册表__。它是在第一次发出警告时设置的。
当第二个警告出现时,过滤器甚至不会被查看。
我认为解决此问题的最佳方法是使 __warningsregistry__ 无效
当使用过滤器时。最好存储警告数据
在全局的 then 中而不是在模块中,所以很容易失效。
顺便说一句,bug https://bugs.python.org/issue4180已作为版本 3.4 和 3.5 的修复而关闭。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)