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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:40:24