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

Discord.py中Guild.bans()报错:缺少必需的self参数

问题解决方法

错误原因很明确:你直接调用了discord.Guild类的bans()方法,而这个方法需要类的实例(具体的服务器对象)作为第一个参数(self),但你没有传入,所以触发了参数缺失的错误。

修正后的代码

@tree.command(name="unban", description="Unbans a member.", guild=discord.Object(id=guildid))
async def unban(ctx, member: str):
    try:
        # 使用ctx.guild(当前命令所在的服务器实例)调用bans()方法
        banned_users = await ctx.guild.bans()
        member_name, member_discriminator = member.split("#")
        
        for ban_entry in banned_users:
            user = ban_entry.user
            if (user.name, user.discriminator) == (member_name, member_discriminator):
                await ctx.guild.unban(user)
                await ctx.response.send_message(f"已解除对 {user.mention} 的封禁")
                return
        # 未找到匹配的封禁用户时反馈
        await ctx.response.send_message("未找到该用户的封禁记录")
    except ValueError:
        # 处理用户输入格式错误(无#分隔符)
        await ctx.response.send_message("请使用正确格式:用户名#四位数字")

关键修正点

  • 替换await discord.Guild.bans()为await ctx.guild.bans():ctx.guild是当前命令上下文提供的服务器实例,调用它的bans()方法才符合类方法的调用规则。
  • 添加异常处理:避免用户输入格式错误导致程序崩溃,同时给用户明确操作反馈。
  • 补充结果反馈:让用户清楚知道命令执行的最终状态,不管是成功解除封禁还是未找到目标用户。

额外优化建议

目前Discord已逐步取消用户 discriminator(#后的四位数字),改用唯一用户名(带@标识),建议改用用户ID查询封禁用户,这样更准确且不受用户名变更影响:

@tree.command(name="unban", description="Unbans a member.", guild=discord.Object(id=guildid))
async def unban(ctx, user_id: str):
    try:
        user = await ctx.bot.fetch_user(int(user_id))
        await ctx.guild.unban(user)
        await ctx.response.send_message(f"已解除对 {user.mention} 的封禁")
    except discord.NotFound:
        await ctx.response.send_message("未找到该用户")
    except discord.Forbidden:
        await ctx.response.send_message("我没有解除封禁的权限")
    except ValueError:
        await ctx.response.send_message("请输入有效的用户ID")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:25:15