如何阻止 np.vectorize 从我捕获的打印错误



我最近从Python 2迁移到Python 3,遇到了一个我认为在Python 2中没有发生的问题(但我不完全确定。

以下代码打印出警告(但不会停止运行(:

import numpy as np
@np.vectorize
def reciprocal(num):
    try:
        return 1/num
    except ZeroDivisionError:
        return 0
reciprocal(0)
#prints: RuntimeWarning: divide by zero encountered in long_scalars

即使我在我的函数中处理错误就很好了。

如何阻止此警告打印/发生?

虽然另一个解决方案中提供的suppressWarning装饰器可以工作,但它可能有点太允许了,因为它根本不报告警告。我认为,至少有时,最好通过将它们提升为错误来明确警告,然后按此处理它们。这可以通过warnings模块轻松完成:

import numpy as np
import warnings
warnings.filterwarnings('error')
@np.vectorize
def reciprocal(num):
    try:
        return 1/num
    except ZeroDivisionError:
        # Now we end up here.
        return 0
reciprocal(0)

我创建了一个装饰器来抑制函数上的警告。它使用与 Python 文档中的临时禁止警告相同的策略。

import warnings
def suppressWarnings(func):
    def wrapper(*args, **kwargs):
        with warnings.catch_warnings():
            warnings.simplefilter("ignore")
            func(*args, **kwargs)
    return wrapper

然后,您可以执行以下操作:

import numpy as np
@suppressWarnings
@np.vectorize
def reciprocal(num):
    try:
        return 1/num
    except ZeroDivisionError:
        return 0
reciprocal(0)

它不会打印出任何警告。

最新更新