python - scipy覆盖警告过滤器?
问题描述
似乎一些 scipy 模块正在弄乱我的警告过滤器。考虑以下代码。我的理解是,由于我提供给自定义警告类的“一次”过滤器,它应该只抛出一个警告。但是,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.py
器scipy.sparse.__init__.py
。我看不出该代码将如何导致问题,但确实如此。当我评论这些过滤器时,我的代码按预期工作。
我是不是误会了什么?是否有不涉及覆盖warnings.filterwarnings
/的解决方法warnings.simplefilters
?
解决方案
这是一个开放的 Python 错误:https ://bugs.python.org/issue29672 。
请特别注意Tom Aldcroft 评论的最后一部分:
即使是文档更新也会很有用。这不仅可以解释
catch_warnings()
,而且通常可以解释意外的特性,即如果堆栈中的任何包设置了警告过滤器,则全局重置之前是否已看到警告(通过调用_filters_mutated()
)。
中的代码scipy/special/sf_error.py
设置了一个警告过滤器,这会导致全局重置之前已经看到的警告。(如果您warnings.warn('warning!', W)
在示例代码的末尾添加另一个调用,您应该会看到它不会引发警告。)
推荐阅读
- python - 如何在没有 for 循环的情况下从不同的数据帧中获取值?
- python - 如何使用python将多个数据存储在一个文件中?
- laravel - 获取 Auth Laravel 数据以使用 Vue 填充
- c# - WPF 中用户控件的输入和输出
- javascript - 使用 GET curl PHP 显示 Javascript 值
- ios - 如何在快速向 alamofire 发送请求之前安排数组
- oracle - ORA-12899错误相同列的字符串太大但不同的表成功
- android - RxJava observeOn 似乎无法正常工作
- angular - 在 Mat 分页器 pageOptions 中不起作用
- c# - 如何在 C# 中使用 LINQ 按位数对整数进行分组