1

我想使用Tenacity Python 库作为它的@retry装饰器。但是,我想在每次重试时使用不同的参数调用我的函数,但不知道如何指定。

我的函数定义如下所示:

from tenacity import retry, retry_if_exception_type, stop_after_attempt

class CustomError(Exception):
    pass

@retry(retry=retry_if_exception_type(CustomError), stop=stop_after_attempt(2))
def my_function(my_param):
    result = do_some_business_logic(my_param)
    if not result:
        if my_param == 1:
            raise CustomError()
        else:
            raise ValueError()

# first invoke the function with my_param=1, then retry with my_param=2 
my_function(1)

这有点简化,但想法是当我第一次调用该函数时,我将1作为第一个参数传入。重试时,我希望它将此值更改为2. 这可以用 Tenacity 的@retry装饰器完成吗?也许通过回调?

4

1 回答 1

1

最简单的方法可能是传入,而不是整数,而是一个产生所需值的可迭代对象。例如:

@retry(retry=retry_if_exception_type(CustomError), stop=stop_after_attempt(2))
def my_function(my_iter):
    my_param = next(my_iter)
    result = do_some_business_logic(my_param)
    if not result:
        if my_param == 1:
            raise CustomError()
        else:
            raise ValueError()

my_function(iter([1, 2]))

不过,这看起来确实像一个XY 问题;可能有更好的方法来使用 Tenacity 来做你想做的事。也许你应该发布一个关于重试的更一般的问题。

于 2019-01-18T18:19:50.007 回答