Python 如何让retry decorator指示已使用所有重试?

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,

我已经在代码中实现了重试修饰符,但希望以某种方式指示它何时使用了所有重试。我该怎么做

我使用的是v1.3.3

我尝试使用stop_func,但这似乎是在名义行为中调用的,而不是在重试时调用的

我不知道如何从装饰师那里拨出尝试号码

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!'