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)
在 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)