old_stalin
@old_stalin

Как сделать декоратор из async функции в классе?

Есть файл moderation в котором класс Mute:
class Mute(Moderation):
    def __init__(self, bot):
        super().__init__(bot)

    @command()
    @has_permissions(administrator=True)
    async def create_mrole(self, ctx, *, name: str = "muted"):
        ...
        loading_bar(self.update_mute(ctx), ctx)

    @command()
    @has_permissions(administrator=True)
    async def update_mute(self, ctx):
        ...

в той же директории есть файл loading_bar c функцией (просто функция без класса):
from bot.config import loading


def loading_bar(func, ctx):
    print(1)

    async def decorator():
        print(2)
        loading_message = await ctx.channel.send(loading[0], delete_after=10)
        await func()
        for i in range(1, 6):
            await loading_message.edit(content=loading[i])
            print(3)

    return decorator

Я просто не понимаю как правильно и что передать в loading_bar что бы это работало (делать loading_bar async или нет, передать await self.update_mute(ctx), или просто self.update_mute(ctx), как правильно вернуть async декоратор и как правильно вызвать функцию self.update_mute(ctx) в нем, помогите пожалуйста)
  • Вопрос задан
  • 118 просмотров
Решения вопроса 1
tumbler
@tumbler Куратор тега Python
бекенд-разработчик на python
Декоратор - это в самом простом варианте функция, принимающая на вход другую функцию и возвращающая третью. Чтобы использовать синтаксис с собачкой, декоратор должен уметь работать с одним единственным позиционным аргументом, а ваш loading_bar требует двух.
def loading_bar(async_func):
    @wraps(async_func)
    async def wrapper(*args, **kwargs):
        await func(*args, **kwargs)
    return wrapper

@loading_bar
async def my_async_func(): pass


ctx в данном примере взяться неоткуда, так что придется добавлять его в параметры wrapper и во все вызовы декорированной функции. Как именно - Вам виднее с полным кодом.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы