如何只打印第一次出现的python警告?

时间:2018-01-30 15:27:41

标签: python warnings

我有一个在很多不同时间调用的函数。该功能必须打印警告,但仅限第一次。每次调用该函数时都不应打印警告。

def func():
    if(condition):
        warnings.warn('warn message',RuntimeWarning)

如何确保仅在condition第一次为真时打印此警告,而不是每次都打印。

其他答案都没有帮助我。我遇到了warning filters,但我不明白如何在这里使用它。

2 个答案:

答案 0 :(得分:1)

您可以使用一个开始为style的辅助变量,并在第一个警告时转为false。 如果你必须多次执行该函数,一个简单的解决方案是将它包装在一个类中,并将该变量存储在类的实例中:

true

答案 1 :(得分:1)

可能会在那里找到解决方案:https://docs.python.org/2/library/warnings.html#warning-filter

warnings.simplefilter('once', RuntimeWarning)

这里使用装饰器的自定义解决方案:您不必将函数实现更改为类,您保持逻辑以捕获与其余代码分开的第一个警告。

警告:

def warn_only_once(function):
    function.already_warned = False
    def wrapper(*args, **kwargs):
        with warnings.catch_warnings(record=function.already_warned):
            function.already_warned = not function.already_warned
            return function(*args, **kwargs)
    return wrapper

@warn_only_once
def test():
     warning.warn('hello', RuntimeWarning)

加注:

def warn_only_once(function):
    function.already_warned = False
    def wrapper(*args, **kwargs):
        try:
            return function(*args, **kwargs)
        except RuntimeWarning as warning:
            if not function.already_warned:
               function.already_warned = True
               raise warning
    return wrapper

@warn_only_once
def test():
     raise RuntimeWarning('hello')