Discord.py v2抽奖命令报错:'async_generator'无'flatten'属性
解决discord.py v2中'async_generator' object has no attribute 'flatten'错误
discord.py v2移除了原v1版本中异步集合对象的flatten()方法,所有返回成员、消息等集合的接口现在返回异步生成器,需要通过异步遍历的方式将其转换为列表,替代原来的flatten()逻辑。
原错误代码示例(触发问题的场景)
@bot.command() async def raffle(ctx): # 原v1写法,v2中会报错 members = await ctx.guild.members.flatten() winner = random.choice(members) await ctx.send(f"恭喜{winner.mention}中奖!")
替换方案1:异步列表推导式(推荐)
直接用异步列表推导式遍历异步生成器,生成列表:
import random import discord from discord.ext import commands @bot.command() async def raffle(ctx): # 替换flatten(),异步遍历生成成员列表 members = [member async for member in ctx.guild.members] # 可选:过滤掉机器人账号 # members = [member async for member in ctx.guild.members if not member.bot] winner = random.choice(members) await ctx.send(f"恭喜{winner.mention}中奖!")
替换方案2:async for循环收集
如果需要更灵活的处理(比如中途添加额外逻辑),可以用async for循环手动收集元素:
@bot.command() async def raffle(ctx): members = [] async for member in ctx.guild.members: # 可在这里添加自定义过滤或处理逻辑 if not member.bot: members.append(member) winner = random.choice(members) await ctx.send(f"恭喜{winner.mention}中奖!")
核心原理
discord.py v2为了优化内存占用,将批量获取资源的接口改为返回异步生成器,避免一次性加载所有数据到内存。因此需要通过异步遍历的方式逐个取出元素,再组装成列表供后续使用。
内容的提问来源于stack exchange,提问作者I am goku
相关产品推荐
相关产品推荐

