Discord Bot !unban命令报错:async_generator无法用于await表达式
解决Discord Bot解封(unban)功能的TypeError错误
错误原因
报错TypeError: object async_generator can't be used in 'await' expression的根源是这行代码:
banned_users = await ctx.guild.bans()
ctx.guild.bans()返回的是异步生成器,不是可以直接用await等待的协程对象,因此不能用await直接接收它的返回值。
修复方案
有两种可行的修复方式,任选其一即可:
方式一:使用async for遍历异步生成器
直接遍历ctx.guild.bans()返回的异步生成器,不需要提前收集所有封禁记录:
@commands.command(name="unban") @has_permissions(ban_members=True) async def unban(self, ctx, *, member): 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) await ctx.send(f"{user.mention} 已成功解封") return await ctx.send("未找到该用户的封禁记录")
注:原代码中的if ctx.author.guild_permissions.ban_members:可以删除,因为@has_permissions(ban_members=True)装饰器已经会自动检查调用者的权限,无需重复判断。
方式二:将异步生成器转为列表
通过异步列表推导式把所有封禁记录收集到列表中,再进行遍历:
@commands.command(name="unban") @has_permissions(ban_members=True) async def unban(self, ctx, *, member): 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) await ctx.send(f"{user.mention} 已成功解封") return await ctx.send("未找到该用户的封禁记录")
额外优化
- 增加了输入格式错误的处理,避免用户输入不符合要求时程序崩溃
- 解封成功或未找到用户时添加了反馈提示,提升交互体验
内容的提问来源于stack exchange,提问作者atunagamer
相关产品推荐
相关产品推荐

