Python3.10+discord.py机器人解封命令触发TypeError错误求助
解决discord.py Unban命令的TypeError错误
错误根源在于这行代码:
banned_users = await ctx.guild.bans()
ctx.guild.bans() 返回的是异步生成器,并非可直接用await获取结果的对象,这就是触发TypeError: object async_generator can't be used in 'await' expression的原因。
下面提供两种修复方案,同时优化了代码的用户体验:
方案1:使用async for遍历异步生成器
直接遍历异步生成器,无需提前存储所有封禁记录:
@Sapphire.command() @commands.has_permissions(ban_members=True) async def unban(ctx, *, member): """Unbans a member from the server.""" try: member_name, member_discriminator = member.split("#") except ValueError: await ctx.send("请输入正确的用户格式:用户名#四位数字") return async for ban_entry in ctx.guild.bans(): user = ban_entry.user if (user.name, user.discriminator) == (member_name, member_discriminator): await ctx.guild.unban(user) # 合并Embed,避免重复发送消息 unban_embed = discord.Embed( description=f"已解封 {user.mention}\n{user} 已从服务器解封 | 解封人:{ctx.author.name}", color=0xc700ff ) await ctx.send(embed=unban_embed) try: await user.send(embed=discord.Embed( description=f"你已被 **{ctx.guild.name}** 服务器解封,解封人:**{ctx.author.name}**。", color=0xc700ff )) except discord.Forbidden: pass break else: await ctx.send(f"未找到被封禁的用户:{member}。")
方案2:将异步生成器转换为列表
如果需要提前获取所有封禁记录,可以用异步列表推导式转成列表:
@Sapphire.command() @commands.has_permissions(ban_members=True) async def unban(ctx, *, member): """Unbans a member from the server.""" try: member_name, member_discriminator = member.split("#") except ValueError: await ctx.send("请输入正确的用户格式:用户名#四位数字") return # 将异步生成器转为列表 banned_users = [entry async for entry in ctx.guild.bans()] for ban_entry in banned_users: user = ban_entry.user if (user.name, user.discriminator) == (member_name, member_discriminator): await ctx.guild.unban(user) unban_embed = discord.Embed( description=f"已解封 {user.mention}\n{user} 已从服务器解封 | 解封人:{ctx.author.name}", color=0xc700ff ) await ctx.send(embed=unban_embed) try: await user.send(embed=discord.Embed( description=f"你已被 **{ctx.guild.name}** 服务器解封,解封人:**{ctx.author.name}**。", color=0xc700ff )) except discord.Forbidden: pass break else: await ctx.send(f"未找到被封禁的用户:{member}。")
额外优化点:
- 增加了用户输入格式错误的判断(比如未输入#)
- 合并了重复发送的Embed消息,减少频道刷屏
内容的提问来源于stack exchange,提问作者ghost121S
相关产品推荐
相关产品推荐

