Как использовать Decorator на абстрактном методе в Python? - PullRequest
0 голосов
/ 26 марта 2020

Я хочу создать класс для интерфейса 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 хочу знать погоду где-нибудь, где можно изменить, чтобы исправить эту проблему. Или есть лучшее решение для решения этой проблемы.

Спасибо за то, что ваш пациент посмотрел эту статью или ответил на вопрос.

...