Я хочу создать класс для интерфейса API. Это определяет, какая функция должна быть реализована, и функция будет повторяться при возникновении исключения.
Сначала я создаю класс повтора для реализации функций повтора, которые можно декорировать в классе или функции.
class Retry:
def __init__(self, retries_limit=3, allowed_exceptions=Exception):
self.retries_limit = retries_limit
self.allowed_exceptions = allowed_exceptions
def __call__(self, operation):
@wraps(operation)
def wrapped(*args, **kwargs):
last_raised = None
for _ in range(self.retries_limit):
try:
return operation(*args, **kwargs)
except self.allowed_exceptions as e:
print(f'retrying {operation.__qualname__} due to {e}')
last_raised = e
raise last_raised
return wrapped
Если я украсил функцию с повтором, как показано ниже, она работает!
@Retry()
def func():
"""if this function raise exception, it will retry three times."""
Затем я хочу создать класс для интерфейса Api. Это определяет, какая функция должна быть реализована, и функция будет повторяться при возникновении исключения.
class ApiInterface(abc.ABC):
def __init__(self):
pass
@Retry()
@abc.abstractmethod
def get_session(self):
pass
@Retry()
@abc.abstractmethod
def add_domain(self, *args):
pass
Теперь мы можем видеть класс, наследование которого над классом (ApiInterface) должно реализовывать две функции: get_session () и add_domain (). Если какое-то исключение поднять в пределах этих двух функций. Декоратор @Retry выполнит повторную попытку.
Наконец, увидим результат. Я создаю класс (SomeApi) для наследования ApiInterface.
class SomeApi(ApiInterface):
def __init__(self):
super().__init__()
def get_session(self):
"""do something"""
def add_domain(self):
"""do something""""
К сожалению, @Retry, похоже, не действует, когда get_session () и add_domain () вызывают исключение ...
I хочу знать погоду где-нибудь, где можно изменить, чтобы исправить эту проблему. Или есть лучшее решение для решения этой проблемы.
Спасибо за то, что ваш пациент посмотрел эту статью или ответил на вопрос.