我有一个在很多不同时间调用的函数。该功能必须打印警告,但仅限第一次。每次调用该函数时都不应打印警告。
def func():
if(condition):
warnings.warn('warn message',RuntimeWarning)
如何确保仅在condition
第一次为真时打印此警告,而不是每次都打印。
其他答案都没有帮助我。我遇到了warning filters
,但我不明白如何在这里使用它。
答案 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')