Повторить попытку 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()
Другие вопросы по тегам