如何阻止np.vectorize打印我遇到的错误

时间:2017-05-13 05:53:50

标签: python numpy warnings

我最近从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

即使我正在处理我的函数中的错误。

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

2 个答案:

答案 0 :(得分:2)

虽然在另一个解决方案中提供的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)

答案 1 :(得分:1)

我创建了一个装饰器来抑制函数的警告。它使用与Python文档中的Temporarily Suppressing Warnings相同的策略。

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)

并且不会打印出任何警告。