YardalGedal
@YardalGedal
yeah boy

Можно ли сделать декоратор, работающий и с асинхронными, и с синхронными функциями?

Допустим, у есть просто декоратор:
def if_no_data(f):
    def wrapper(self, *args, **kwargs):
        if not self.data:
            return f(self, *args, **kwargs)

    return wrapper

Суть его работы проста - проверить на пустоту свойство объекта. Отлично, а если нужно чтобы декоратор работал как с асинхронными, так и с синхронными функциями?
Что-то такое выглядит очень странно, да и вряд ли работать будет.
def if_no_data(f):
    async def wrapper(self, *args, **kwargs):
        if not self.data:
            result = f(self, *args, **kwargs)

            try:
                return await result
            except ValueError:
                return result

    return wrapper
  • Вопрос задан
  • 935 просмотров
Решения вопроса 1
Что-то типа того

def if_no_data(f):
    async def wrapper(self, *args, **kwargs):
        if self.data:
            return None

        if asyncio.iscoroutinefunction(f):
            return await f(self, *args, **kwargs)
        else:
            return f(self, *args, **kwargs)

    return wrapper
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы