scipy 覆盖警告过滤器?

时间:2021-04-29 01:05:53

标签: python scipy

似乎某些 scipy 模块正在干扰我的警告过滤器。考虑以下代码。我的理解是它应该只抛出 one 警告,因为我提供给我的自定义警告类的“一次”过滤器。但是,也会显示 scipy 导入后的警告。 这是使用 python 3.7 和 scipy 1.6.3。

import warnings
class W(DeprecationWarning): pass
warnings.simplefilter("once", W)

warnings.warn('warning!', W)
warnings.warn('warning!', W)

from scipy import interpolate

warnings.warn('warning!', W)

这似乎只发生在我导入某些 scipy 模块时。通用的“import scipy”不会这样做。

我已将范围缩小到 scipy.special.sf_error.pyscipy.sparse.__init__.py 中设置的过滤器。我不明白该代码将如何导致问题,但确实如此。当我评论这些过滤器时,我的代码按预期工作。

我是不是误会了什么?是否有不涉及覆盖 warnings.filterwarnings/warnings.simplefilters 的解决方法?

1 个答案:

答案 0 :(得分:2)

这是一个开放的 Python 错误:https://bugs.python.org/issue29672

特别注意 comment by Tom Aldcroft 的最后一部分:

<块引用>

即使是文档更新也会很有用。这不仅可以解释 getUserDeviceTraits,还可以解释一般情况下的意外特性,即如果堆栈中任何位置的任何包设置了警告过滤器,那么全局重置是否之前已经看到警告(通过调用 {{1} }).

scipy/special/sf_error.py 中的代码设置了一个警告过滤器,这会导致对以前见过的警告进行全局重置。 (如果您在示例代码的末尾添加另一个 catch_warnings() 调用,您应该会看到它不会引发警告。)

相关问题