navigation Navigation


Inhaltsverzeichnis

aiter()


Die Python-Funktion aiter() ist eine eingebaute Funktion, die einen asynchronen Iterator aus einem asynchronen iterierbaren Objekt erzeugt. Sie ermöglicht die effiziente Verarbeitung von Datenströmen und asynchronen Quellen, indem sie das Iterieren über Objekte im asynchronen Kontext vereinfacht. aiter() ist besonders nützlich bei der Arbeit mit asynchronen Generatoren und unterstützt moderne Programmiermuster für nebenläufige und ereignisgesteuerte Anwendungen.

Inhaltsverzeichnis

    Einführung

    Die Funktion aiter() liefert einen asynchronen Iterator aus einem asynchronen Iterable - also genau das, was async for intern benötigt. In alltäglichem Code nutzt man meist direkt async for. Die Funktion aiter() braucht man dann, wenn man Iteration manuell steuern möchte.

    Sobald man in Python asynchron iteriert (Datenströme, Netzwerk, zeitverzögerte Events), reichen normale Iteratoren (iter, next) nicht aus, weil das Abrufen des nächsten Elements warten (awaiten) muss. aiter() standardisiert den ersten Schritt: Aus einem asynchronen Iterable einen asynchronen Iterator machen - äquivalent zu obj.__aiter__().

    Syntax

    Syntax
    aiter(async_iterable)
    async_iterable

    Ein Objekt, das die asynchrone Iterationsprotokoll-Methode __aiter__(self) bereitstellt.


    Konzeptionelle Typen (PEP-484)

    Syntax
    from typing import AsyncIterable, AsyncIterator, TypeVar
    
    T = TypeVar("T")
    
    def aiter(async_iterable: AsyncIterable[T] -> AsyncIterator[T]): ...

    Rückgabewert

    Ein asynchroner Iterator (ein Objekt mit __anext__), der mit await anext(iterator) oder in async for konsumiert werden kann.

    Wichtig: aiter() selbst ist nicht await-bar. Es liefert sofort das Iteratorobjekt.

    Beispiele

    Asynchroner Generator

    Beispiel
    import asyncio
    
    
    async def ticker(n):
        for i in range(n):
            await asyncio.sleep(0.1)
            yield i
    
    
    async def main():
        async_iterator = aiter(ticker(3))
    
        from builtins import anext
    
        try:
            print(await anext(async_iterator))
            print(await anext(async_iterator))
            print(await anext(async_iterator))
            print(await anext(async_iterator))
    
        except StopAsyncIteration:
            print("Fertig")
    
    
    asyncio.run(main())
    0
    1
    2
    Fertig
    • ticker() ist ein async Generator, bereits AsyncIterable und AsyncIterator.
    • aiter(ticker(3)) gibt einen Iterator zurück, den man mit await anext(async_iterator) Stück für Stück konsumiert.
    • Ist er leer, wirft anext die Ausnahme StopAsyncIteration (wie next die Ausnahme StopIteration wirft).

    Eigener asynchroner Iterator (Klasse)

    Beispiel
    import asyncio
    
    
    class CountDown:
        
        def __init__(self, start: int):
            self.current = start
    
        def __aiter__(self):
            return self
    
        async def __anext__(self):
            if self.current <= 0:
                raise StopAsyncIteration
    
            await asyncio.sleep(0.05)
            self.current -= 1
    
            return self.current
    
    
    async def main():
        count_down_iter = aiter(CountDown(3))
    
        from builtins import anext
    
        print(await anext(count_down_iter))
        print(await anext(count_down_iter))
        print(await anext(count_down_iter))
        print(await anext(count_down_iter, "leer"))
    
    
    asyncio.run(main())
    2
    1
    0
    leer

    Wichtige Details:

    • __aiter__ muss direkt einen asynchronen Iterator liefern (kein Awaitable).
    • anext(it, default) gibt bei Erschöpfung default zurück, anstatt StopAsyncIteration zu werfen.