A generator can be iterated step by step by using the next() built-in function. For example:
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
Using next() on an asynchronous generator does not work:
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())
Does something like v = await async_next(ag) exist to obtain same behavior as with normal generators?
Since Python 3.10 there are aiter(async_iterable) and awaitable anext(async_iterator) builtin functions, analogous to iter and next, so you don't have to rely on the async_iterator.__anext__() magic method anymore. This piece of code works in python 3.10:
import asyncio
async def async_gen(n):
    for i in range(n):
        yield i**2
async def main():
    print("Async next:")
    ag = async_gen(4)
    print(await anext(ag))
asyncio.run(main())
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With