【;Python】;使用不同类中的另一个函数调用异步函数?

【;Python】;使用不同类中的另一个函数调用异步函数?,python,discord.py,Python,Discord.py,我有一个具有异步函数的类: from discord.ext import commands class CLASSA(): def __init__(self, bot: commands.Bot): self.bot = bot self.voice_states = {} async def core_functionality(self, ctx: commands.Context): ""&

我有一个具有异步函数的类:

from discord.ext import commands

class CLASSA():
    def __init__(self, bot: commands.Bot):
        self.bot = bot
        self.voice_states = {}
    
    async def core_functionality(self, ctx: commands.Context):
        """Omit"""

    @commands.command(name='cmd', invoke_without_subcommand=True):
    async def _cmd(self, ctx: commands.Context):
        return self.core_functionality(ctx)

def function(bot, ctx):
    """!!!CALL_cmd!!!"""
    obj.bot.loop.create_task(CLASSA(bot).core_functionality(ctx))
来自discord.ext导入命令
类CLASSa():
def uuu init uuuu(self,bot:commands.bot):
self.bot=bot
self.voice_states={}
@commands.command(name='cmd',调用_而不调用_子命令=True)
async def_cmd(self,ctx:commands.Context):
“省略”
我想在外部调用此函数
\u cmd
。我编写的当前代码和结构如下:

def功能(bot、ctx):
“!!!打电话!!!”
obj=A类(机器人)
obj.bot.loop.create_任务(obj._cmd(obj,ctx))
类CLASSb():
def uuu init uuuu(self,bot:commands.bot):
self.bot=bot
@commands.Cog.listener()
异步def on_消息(self,ctx):
功能(self.bot、ctx)
错误:

Task exception was never retrieved
future: <Task finished name='Task-15' coro=<Command.__call__() done, defined at /opt/virtualenvs/python3/project_name/python3.8/site-packages/discord/ext/commands/core.py:358> exception=TypeError("_cmd() missing 1 required positional argument: 'ctx'")>
Traceback (most recent call last):
  File "/opt/virtualenvs/python3/project_name/python3.8/site-packages/discord/ext/commands/core.py", line 374, in __call__
    return await self.callback(*args, **kwargs)
TypeError: _cmd() missing 1 required positional argument: 'ctx'
从未检索到任务异常 未来: 回溯(最近一次呼叫最后一次): 文件“/opt/virtualenvs/python3/project_name/python3.8/site packages/discord/ext/commands/core.py”,第374行,在调用中__ 返回等待自我回调(*args,**kwargs) TypeError:_cmd()缺少1个必需的位置参数:“ctx”
非常感谢。

我认为
@命令
装饰程序正在更改函数的签名

您可能希望重构核心功能,只调用裸函数:

from discord.ext import commands

class CLASSA():
    def __init__(self, bot: commands.Bot):
        self.bot = bot
        self.voice_states = {}
    
    async def core_functionality(self, ctx: commands.Context):
        """Omit"""

    @commands.command(name='cmd', invoke_without_subcommand=True):
    async def _cmd(self, ctx: commands.Context):
        return self.core_functionality(ctx)

def function(bot, ctx):
    """!!!CALL_cmd!!!"""
    obj.bot.loop.create_task(CLASSA(bot).core_functionality(ctx))

顺便说一句,有一个打字错误
CASSa
…已经更新。但问题不在这里。可能是不协调的命令。命令包装器没有很好地处理类成员函数,我这么说是因为我假设如果你不将该函数放入类中,它就会按预期工作,您可以通过不在函数中声明ctx参数,然后打印
type(self)来测试是否存在这种情况
如果它说它是一个commands.Context对象,则表示包装器不允许类函数调用,您需要重新编写代码来处理该类函数,或者编辑命令。command wrapper确实如此。感谢您的帮助,问题就出在这里。使用另一个裸函数来激活该命令。最后但是后来我遇到了一个我根本不懂的问题。哈哈