Python 如何让retry decorator指示已使用所有重试?
我已经在代码中实现了重试修饰符,但希望以某种方式指示它何时使用了所有重试。我该怎么做 我使用的是v1.3.3 我尝试使用stop_func,但这似乎是在名义行为中调用的,而不是在重试时调用的 我不知道如何从装饰师那里拨出尝试号码Python 如何让retry decorator指示已使用所有重试?,python,python-decorators,Python,Python Decorators,我已经在代码中实现了重试修饰符,但希望以某种方式指示它何时使用了所有重试。我该怎么做 我使用的是v1.3.3 我尝试使用stop_func,但这似乎是在名义行为中调用的,而不是在重试时调用的 我不知道如何从装饰师那里拨出尝试号码 from retrying import retry def _query_with_retries(self): _retriable_query = retry(stop_max_attempt_number=3,
from retrying import retry
def _query_with_retries(self):
_retriable_query = retry(stop_max_attempt_number=3,
wait_incrementing_start=50,
wait_incrementing_increment=10)(self._query)
return _retriable_query()
目前,我的代码只是在最后一次重试时抛出一个通用异常。我希望能够发送消息“所有重试都已用完”或类似的消息。您可以捕获装饰程序停止重试时引发的
重试.RetryError
异常;在您自己的包装装饰器中执行此操作:
from functools import wraps
from retrying import retry, RetryError
def printing_retry(*args, **kwargs):
def decorator(f):
decorated = retry(*args, **kwargs)(f)
@wraps(decorated)
def wrapper(*args, **kwargs):
try:
return decorated(*args, **kwargs)
except RetryError:
print("All retries have been used up")
# optionally, re-raise the exception at this point
# raise
return wrapper
if len(args) == 1 and callable(args[0]):
return decorator(args[0])
return decorator
此修饰符将替换代码中的@retry
修饰符;调用修饰函数时,它将捕获函数尝试次数不足时引发的RetryError
异常,并打印一条消息
如果要在RetryException
异常中包装重试期间引发的任何异常,请记住设置wrap\u exception=True
演示:
try:return\u retreable\u query();除了一些例外:print(‘所有重试次数都已用完’)
?@Idlehands,这正是我想要的!起初,它对我不起作用。然后我意识到我忘了包括wrap_exception=True。有了这个,这个效果很好!谢谢Martijn!
>>> @printing_retry(stop_max_attempt_number=1, wrap_exception=True)
... def do_something_unreliable():
... if random.randint(0, 10) > 1:
... raise IOError("Broken sauce, everything is hosed!!!111one")
... else:
... return "Awesome sauce!"
...
>>> do_something_unreliable()
All retries have been used up
>>> do_something_unreliable()
'Awesome sauce!'