在异步生成器上使用next()

2024-05-28 23:54:08 发布

您现在位置:Python中文网/ 问答频道 /正文

可以使用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)的东西来获得与普通生成器相同的行为


Tags: inasyncioforasyncmaindefrangesync
2条回答

如前所述next在异步生成器上不起作用,因为它不是迭代器

如果必须使用函数,则可以创建帮助器函数,而不是使用__anext__函数:

async def anext(ait):
    return await ait.__anext__()

ag = async_gen(4)
v = await anext(ag)
print(v)

PEP525 Asynchronous Generator Object描述了__anext__()方法:

agen.__anext__(): Returns an awaitable, that performs one asynchronous generator iteration when awaited.

所以可以称之为:

print("Async next:")
ag = async_gen(4)
v = await ag.__anext__()
print(v)

但如前所述here不建议这样做

相关问题 更多 >

    热门问题