使用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)
的东西来获得与正常生成器相同的行为?
3条答案
按热度按时间xmq68pz91#
因为Python 3.10有
aiter(async_iterable)
和awaitable anext(async_iterator)
内置函数,类似于iter
和next
,所以你不必再依赖async_iterator.__anext__()
魔术方法了,下面这段代码在Python 3.10中是有效的:2izufjch2#
如前所述,
next
不能在异步生成器上工作,因为它不是迭代器。如果必须使用函数,可以创建一个helper函数,而不是使用
__anext__
函数outrite:编辑:
从python 3.10开始,他们引入了这个内置函数:
anext
pvcm50d13#
PEP525异步发生器对象描述
__anext__()
方法:agen.__anext__()
:返回一个awatable,它在等待时执行一次异步生成器迭代。所以我们可以称之为:
但是,如here所述,不建议这样做