Python 使用动态参数重试

Python retry with dynamic parameters

retrying and tenacity python 库中尝试过此方法无济于事。

重试通常与装饰器一起使用,例如如下元代码所示:

class FooBar:

   @retry(attempts=3)
   def dosomething():
      ...

我希望在 class

上配置重试参数
class FooBar:
   def __init__(retries=0):
       self.retries = retries

   @retry(attempts=self.retries)
   def dosomething():
      ...

显然这会中断,因为装饰器无法访问对象属性(即无法访问 self)。所以认为这会起作用:

def dosomething():
   with retry(attempts=self.retries):
       ...

但是两个库都不允许在 with 块中调用重试

>  with retry():
E  AttributeError: __enter__

用动态参数包装重试逻辑的首选方法是什么?

您不需要使用具有 @ 语法的修饰符 - 它们也可以用作函数。

from tenacity import retry, stop_after_attempt

class CustomClass:
    def __init__(self, retries):
        decorator = retry(stop=stop_after_attempt(retries), reraise=True)
        self.method_with_retry = decorator(self.method)
    
    def method(self, x):
        print('Trying...')
        if x % 2:
            raise ValueError
        return x

CustomClass(3).method_with_retry(11)