异步生成器构建方法及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




