解决方案:
通常不需要将效果扩展到整个单元格,因为这可能会隐藏一些其他有用的消息,所以使用上下文管理器来忽略警告:
with warnings.catch_warnings():
warnings.simplefilter('ignore')
# Your problematic instruction(s) here
如果有充分的理由保护整个单元格,那么只需通过插入capture "magic" 来防止 stderr 流显示在单元格输出区域中:
`%%capture --no-stderr`
在单元格的顶部(而不是缩进所有行)。
解释:
最合乎逻辑的方法是在关键字with 引入的上下文管理器中插入触发警告的代码。它会在有问题的代码之前和之后关闭并恢复警告系统
Python 提供了 warnings.catch_warnings 这样的上下文管理器:
一个上下文管理器,它复制并在退出时恢复
警告过滤器和showwarning() 函数。如果
record 参数是 False(默认)上下文管理器
输入时返回None。如果record 是True,则列表是
返回逐渐填充的对象,如
自定义 showwarning() 函数(也抑制输出
到sys.stdout)。
您还需要注册一个 过滤器 以对上下文管理器捕获的每个警告做出反应,否则 默认过滤器 保持活动状态。
Python 提供了warnings.simplefilter,其中:
在警告过滤器列表中插入一个简单条目
规格
它注册了一些操作(ignore 表示无操作,always 用于打印警告消息等,请参阅full description)。
例子:
import warnings, math
import numpy as np
# We want to compute the logs of this sequence.
# But log isn't defined for values <= 0
s = [-1, 5, 2, 0]
with warnings.catch_warnings():
warnings.simplefilter('ignore')
r = np.log(s)
print(r)