You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

discord.py中on_message仅传1个参数却报‘需2个参数’错误的排查

问题原因与解决方法

错误根源

你遇到的TypeError确实和参数有关,但不是你主动多传了参数——类中的实例方法必须接收self作为第一个参数。on_message是Cog类里的监听方法,属于实例方法,discord.py会自动把你的BotResponses实例对象和message对象一起传入,而你的方法只定义了message一个参数,所以触发了参数不匹配的报错。

另外代码里还有两个关联问题需要修正:

  • 直接使用bot变量,但在Cog类内部应该通过self.bot引用机器人实例(初始化时已经把bot存入了实例属性)
  • await bot.process_commands(message)也要改成await self.bot.process_commands(message)

修正后的代码

from discord.ext import commands

# Bot responses
class BotResponses(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    @commands.Cog.listener()
    async def on_message(self, message):  # 添加self作为第一个参数
        if message.author == self.bot.user:  # 使用self.bot访问机器人实例
            return
        if message.content.startswith('hello'):
            await message.channel.send('Hello')
        await self.bot.process_commands(message)  # 同样改用self.bot

def setup(bot):
    bot.add_cog(BotResponses(bot))

关键注意事项

  • 类中的所有实例方法(包括Cog的监听方法、命令方法)都必须把self作为第一个参数,它代表类的实例本身,用来访问实例的属性和方法。
  • 在Cog内部不要直接使用外部的bot变量,通过初始化时保存的self.bot操作机器人,既能避免作用域问题,代码也更规范。

内容的提问来源于stack exchange,提问作者Marko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:24:08