Вызов нескольких функций перед командой в Discord.py

#python #discord.py

Вопрос:

Я пытаюсь запустить несколько различных функций, прежде чем запускать команду в шестеренке от моего бота. У меня есть несколько наборов функций, которые должны выполняться, причем некоторые из них достаточно разные, чтобы одна функция не была предпочтительной. Моей первой мыслью было просто использовать discord.ext.commands.before_invoke несколько раз такую команду:

 from myFunctions import function1, function2
from discord.ext import commands

class MyCog(commands.Cog):
    @commands.command(pass_context=True)
    @commands.before_invoke(function1)
    @commands.before_invoke(function2)
    async def myCommand(self, ctx):
        pass
 

К сожалению, в этом коде единственная функция , которая вызывалась бы раньше, — это function1 , поскольку она заменяет крючок для function2 .

Есть ли туземный способ войти Discord.py чтобы запустить несколько функций перед командой?

Комментарии:

1. Рискуя заявить очевидное, не могли бы вы создать функцию, которая последовательно вызывает две функции, и установить ее в качестве крючка?

2. @SilvioMayoloI пытался сказать, что у меня много разных групп функций, поэтому, если бы мне пришлось делать это таким образом, мне пришлось бы создавать группировку для каждого набора из них. Я знаю, что мог бы сделать это таким образом, но надеялся на лучший способ.

Ответ №1:

Выполнение Функций В ПОРЯДКЕ:

Просто поместите их в другую функцию:

 from myFunctions import function1, function2
from discord.ext import commands
from functools import partial

async def fcaller(fs, *args):
    for f in fs:
        f(*args)

class MyCog(commands.Cog):
    @commands.command(pass_context=True)
    @commands.before_invoke(partial(fcaller, [function1, function2]))
    async def myCommand(self, ctx):
        pass
 

Выполнение функции ОДНОВРЕМЕННО:

 from myFunctions import function1, function2
from discord.ext import commands
from threading import Thread
from functools import partial

async def fcaller(fs, *args):
    threads = []
    for f in fs:
       threads.append(Thread(target=f, args=args))
    
    for t in threads:
       t.start()
    
    for t in threads:
       t.join()

class MyCog(commands.Cog):
    @commands.command(pass_context=True)
    @commands.before_invoke(partial(fcaller, [function1, function2]))
    async def myCommand(self, ctx):
        pass
 

Редактировать

Изменил его на универсальный вызов функции после прочтения комментариев

Комментарии:

1. Итак, мне нужно создать функцию для каждой отдельной группы, которая у меня есть?

2. Также существует проблема, что функция before_invoke передаст функциям два аргумента (экземпляр и контекст). как бы вы передали их, используя свой метод?

3. Готово, пожалуйста, проверьте это

4. Также fcaller должен быть асинхронным для работы в before_invoke. К сожалению, это только подтверждает мои опасения по поводу того, как мне придется это сделать. Спасибо.

5. Можете ли вы, пожалуйста, принять ответ, если он решил вашу проблему ?