Повторить попытку Python с динамическими параметрами
Пробовал это в библиотеках 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__
Каков предпочтительный способ обернуть логику повтора динамическими параметрами?
2 ответа
Решение
Вам не нужно использовать деораторы с @
синтаксис - их также можно использовать как функции.
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)
Вложенная функция может помочь в этом:
class FooBar:
def __init__(retries=0):
self.retries = retries
def dosomething():
@retry(attempts=self.retries)
def _dosomething():
...
return _dosomething()