2

重试坚韧的python库中尝试过这个,但无济于事。

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

class FooBar:

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

我希望重试参数可以在类上配置

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__

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

4

1 回答 1

2

您不需要使用@语法中的 deorators - 它们也可以用作函数。

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)
于 2020-07-06T20:34:07.800 回答