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

