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
相关产品推荐
相关产品推荐

