numpy.testing.suppress_warnings#

class numpy.testing.suppress_warnings(forwarding_rule='always')[源代码][源代码]#

上下文管理器和装饰器,与 warnings.catch_warnings 做很多相同的事情.

然而,它还提供了一个过滤机制来解决 https://bugs.python.org/issue4180.

这个错误导致 Python 3.4 之前的版本在警告被忽略一次后(即使在 catch_warnings 内)无法可靠地再次显示警告.这意味着不能轻易使用”忽略”过滤器,因为后续测试可能需要看到警告.此外,它允许更容易地针对测试警告进行具体设置,并且可以嵌套.

参数:
forwarding_rulestr, 可选

“always”、”once”、”module”或”location”之一.类似于通常的warnings模块过滤模式,它主要在外层级别上减少噪音非常有用.未抑制和未记录的警告将基于此规则转发.默认为”always”.”location”等同于warnings的”default”,通过警告发出的确切位置进行匹配.

备注

在上下文管理器内添加的过滤器在离开时将被再次丢弃.进入时,所有在上下文外定义的过滤器将自动应用.

当添加一个记录过滤器时,匹配的警告会存储在 log 属性中,以及由 record 返回的列表中.

如果添加了过滤器并且给出了 module 关键字,则在应用过滤器、进入上下文或退出上下文时,该模块的警告注册表将额外被清除.如果在进入上下文之前已经打印了这些警告并且它们被配置为仅打印一次(默认),则在离开上下文后可能会导致这些警告再次出现.

当转发规则为”总是”(默认)时,嵌套此上下文管理器将按预期工作.未过滤和未记录的警告将被传递出去,并被外层匹配.在最外层,它们将被打印(或被另一个警告上下文捕获).转发规则参数可以修改此行为.

catch_warnings 这样的上下文管理器不是线程安全的.

示例

使用上下文管理器:

with np.testing.suppress_warnings() as sup:
    sup.filter(DeprecationWarning, "Some text")
    sup.filter(module=np.ma.core)
    log = sup.record(FutureWarning, "Does this occur?")
    command_giving_warnings()
    # The FutureWarning was given once, the filtered warnings were
    # ignored. All other warnings abide outside settings (may be
    # printed/error)
    assert_(len(log) == 1)
    assert_(len(sup.log) == 1)  # also stored in log attribute

或者作为一个装饰器:

sup = np.testing.suppress_warnings()
sup.filter(module=np.ma.core)  # module must match exactly
@sup
def some_function():
    # do something which causes a warning in np.ma.core
    pass

方法

__call__(func)

应用于整个函数的特定抑制的函数装饰器.

filter([category, message, module])

添加一个新的抑制过滤器或在进入状态时应用它.

record([category, message, module])

附加一个新的录制过滤器,或者在进入状态时应用它.