python - 在异步生成器上使用 next()
问题描述
next()
使用内置函数可以逐步迭代生成器。例如:
def sync_gen(n):
"""Simple generator"""
for i in range(n):
yield i**2
sg = sync_gen(4)
print(next(sg)) # -> 0
print(next(sg)) # -> 1
print(next(sg)) # -> 4
在异步生成器上使用next()
不起作用:
import asyncio
async def async_gen(n):
for i in range(n):
yield i**2
async def main():
print("Async for:")
async for v in async_gen(4): # works as expected
print(v)
print("Async next:")
ag = async_gen(4)
v = await next(ag) # raises: TypeError: 'async_generator' object is not an iterator
print(v)
asyncio.run(main())
是否存在类似的东西v = await async_next(ag)
以获得与普通生成器相同的行为?
解决方案
如前所述next
,它不适用于异步生成器,因为它不是迭代器。
如果你必须使用一个函数,你可以创建一个辅助函数而不是使用__anext__
函数 outwrite:
async def anext(ait):
return await ait.__anext__()
ag = async_gen(4)
v = await anext(ag)
print(v)
推荐阅读
- hadoop - oozie 工作流抛出 Socket 错误,但 10 分钟后两次提交工作流
- python - Django:如何为每个订单创建自定义参考代码?
- r - 仅折叠 R 中数据框的第一列,其余列数据完好无损
- javascript - 在 Javascript 中舍入多边形角
- java - 是否可以使用来自 MongoDB 的给定 ObjectID 作为实体 ID,以在 Java 中显示在浏览器上?
- c - 在嵌套的 fork() 中正确处理 pipe() 和 close()
- swift - 我如何在应用程序中保持用户登录?迅速 5
- java - 如何从 java 中的另一个方法正确引用变量?
- python - socket.settimeout() 在 Python 2.7(端口扫描器)中不起作用
- spring - 一个控制器可以在 Clean Architecture 中调用多个用例(交互器)吗?