discord.py音乐机器人报错:<lambda>()需0参数却传入1个
问题修复:Discord机器人音乐队列报错 TypeError: () takes 0 positional arguments but 1 was given
直接错误原因
discord.py的VoiceClient.play()方法传入的after回调函数必须接受一个可选的error参数(播放出错时传入错误对象,正常结束则为None)。你当前的lambda表达式未定义该参数,导致播放器调用回调时触发参数不匹配错误。
修复步骤
1. 修正play命令中的after回调
将原代码中的:
vc.play(stream, after=lambda: self.queueCheck(guild, vc))
改为:
vc.play(stream, after=lambda err: self.queueCheck(guild.id, vc))
- 新增
err参数接收播放器传入的错误信息 - 修正
queueCheck的传入参数:原代码传的是guild对象,需改为guild.id(你的queues字典以服务器ID为键)
2. 完善queueCheck的循环播放逻辑
原queueCheck中调用vc.play时未设置after回调,导致队列内后续歌曲播放完后不会自动触发下一首。修改后的函数:
def queueCheck(self, guild_id, vc): if queues.get(guild_id, []): # 更安全的判空方式,避免KeyError stream = queues[guild_id].pop(0) players[guild_id] = stream # 递归设置after回调,实现队列自动续播 vc.play(stream, after=lambda err: self.queueCheck(guild_id, vc))
3. 可选优化点
playSong函数中,可简化音频流获取逻辑,直接使用youtube-dl返回的info['url'](会自动匹配最佳音频流):# 替换原url2的判断逻辑 url2 = info['url']queue命令可新增判断:若当前无正在播放的音频,直接开始播放而非仅加入队列
修复后的核心代码片段
def queueCheck(self, guild_id, vc): if queues.get(guild_id, []): stream = queues[guild_id].pop(0) players[guild_id] = stream vc.play(stream, after=lambda err: self.queueCheck(guild_id, vc)) @commands.command() async def play(self, ctx, *, url): if ctx.voice_client is None: await ctx.author.voice.channel.connect() stream = await self.playSong(ctx, url) guild = ctx.message.guild vc = ctx.voice_client players[guild.id] = stream vc.play(stream, after=lambda err: self.queueCheck(guild.id, vc))
内容的提问来源于stack exchange,提问作者Virat Chauhan
相关产品推荐
相关产品推荐

