You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

异步生成器构建方法及await调用报错的修复咨询

异步生成器构建方法及await调用报错的修复咨询

嘿,我来帮你搞定这个问题~你遇到的TypeError本质原因很简单:sub_process1是一个异步生成器函数,当你调用它的时候,返回的是「异步生成器对象」,而await只能用于等待协程、Future这类可等待对象,异步生成器是不能直接用await去等待的。

哪怕你把sub_process1里的普通for改成async for(不过这里sub_process2返回的是普通列表,其实用async for没必要),只要函数里存在yield关键字,它就还是异步生成器函数,调用后得到的依然是不能被await的对象。

下面给你几种针对性的修复方案,你可以根据自己的需求选:

方案1:遍历异步生成器的所有值(最常用)

如果你需要逐个处理sub_process1生成的元素,直接在main里用async for遍历它就行:

async def main(*args, **kwargs):
    # 用async for遍历异步生成器
    async for item in sub_process1():
        print(item)  # 这里替换成你自己的处理逻辑

async def sub_process1():
    iter_list = await sub_process2()
    for i in iter_list:
        yield i

async def sub_process2():
    return [1, 2, 3]

方案2:一次性获取所有生成的值

如果需要把异步生成器的所有结果收集成一个列表,可以写个小辅助函数来实现:

async def collect_async_generator(gen):
    """把异步生成器的结果收集成列表"""
    result = []
    async for item in gen:
        result.append(item)
    return result

async def main(*args, **kwargs):
    # 调用辅助函数收集所有结果,这时候就可以用await了
    all_items = await collect_async_generator(sub_process1())
    print(all_items)  # 输出: [1, 2, 3]

async def sub_process1():
    iter_list = await sub_process2()
    for i in iter_list:
        yield i

async def sub_process2():
    return [1, 2, 3]

方案3:如果不需要生成器,直接改成协程函数

如果sub_process1其实只是想返回sub_process2的结果,根本不需要生成器功能,那直接去掉yield,把它改成普通的协程函数就行:

async def main(*args, **kwargs):
    # 这时候sub_process1是协程函数,调用后可以直接await
    items = await sub_process1()
    print(items)  # 输出: [1, 2, 3]

async def sub_process1():
    # 直接返回sub_process2的结果,去掉yield
    return await sub_process2()

async def sub_process2():
    return [1, 2, 3]

备注:内容来源于stack exchange,提问作者tobias

火山引擎 最新活动