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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:09:25