#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. Можете ли вы, пожалуйста, принять ответ, если он решил вашу проблему ?