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

Discord.py Ban/Unban命令出现BadArgument错误求助(附代码)

解决Discord.py Ban/Unban命令的BadArgument错误

问题根源

你的代码里有3个关键问题导致了BadArgument错误及其他潜在问题:

  • 类型注解写错了:discord.member 应该是 discord.Member(类名首字母必须大写),Discord.py的参数解析器找不到小写的类,所以抛出BadArgument。
  • ban命令的else分支里没定义bannedRole,只在if分支里定义了,执行else时会报NameError。
  • unban命令的参数格式错误:*, member: discord.Member 里的*会把member变成关键字参数,用户输入时没法正常传递成员对象,也会触发解析错误。

修复后的完整代码

@client.command()
@commands.has_permissions(ban_members=True)
async def ban(ctx, member: discord.Member, *, Reason=None):
    # 把bannedRole的定义移到分支外面,避免else分支找不到变量
    bannedRole = discord.utils.get(ctx.guild.roles, name='Banned')
    if Reason is None:
        await member.add_roles(bannedRole)
        embed = discord.Embed(title='BANNED', description=f'Banned {member.mention}', colour=discord.Colour.dark_red())
        await ctx.send(embed=embed)
    else:
        await member.add_roles(bannedRole)
        embed = discord.Embed(title='BANNED', description=f'Banned {member.mention} for {Reason}', colour=discord.Colour.dark_red())
        await ctx.send(embed=embed)

@client.command()
@commands.has_permissions(ban_members=True)
async def unban(ctx, member: discord.Member):
    bannedRole = discord.utils.get(ctx.guild.roles, name='Banned')
    await member.remove_roles(bannedRole)
    embed = discord.Embed(title='UNBANNED', description=f'Unbanned {member.mention}', colour=discord.Colour.dark_red())
    await ctx.send(embed=embed)

额外提示

  • 确保服务器里确实存在名为Banned的角色,不然discord.utils.get会返回None,执行add_roles或remove_roles时会报错,可以加个判断:
    if not bannedRole:
        await ctx.send("找不到'Banned'角色,请先创建该角色!")
        return
    
  • 如果你的unban是要解除官方的封禁(不是自定义角色封禁),那应该用await ctx.guild.unban(member)而不是移除角色,当前代码是针对自定义封禁角色的逻辑,没问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:45:39