Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 530 – Asynchrone Comprehensions

Autor:
Yury Selivanov <yury at edgedb.com>
Discussions-To:
Python-Dev Liste
Status:
Final
Typ:
Standards Track
Erstellt:
03-Sep-2016
Python-Version:
3.6
Post-History:
03-Sep-2016

Inhaltsverzeichnis

Zusammenfassung

PEP 492 und PEP 525 führen Unterstützung für native Coroutinen und asynchrone Generatoren mit async / await Syntax ein. Diese PEP schlägt vor, asynchrone Versionen von Listen-, Mengen-, Wörterbuch-Comprehensions und Generator-Ausdrücken hinzuzufügen.

Begründung und Ziele

Python hat eine umfassende Unterstützung für synchrone Comprehensions, die es ermöglicht, Listen, Wörterbücher und Mengen mit einer einfachen und prägnanten Syntax zu erzeugen. Wir schlagen vor, ähnliche syntaktische Konstruktionen für den asynchronen Code zu implementieren.

Um die Lesbarkeitsverbesserung zu veranschaulichen, betrachten Sie das folgende Beispiel

result = []
async for i in aiter():
    if i % 2:
        result.append(i)

Mit der vorgeschlagenen asynchronen Comprehensions-Syntax wird der obige Code so kurz wie

result = [i async for i in aiter() if i % 2]

Die PEP ermöglicht auch die Verwendung von await-Ausdrücken in allen Arten von Comprehensions

result = [await fun() for fun in funcs]

Spezifikation

Asynchronous Comprehensions

Wir schlagen vor, async for in Listen-, Mengen- und Wörterbuch-Comprehensions zu erlauben. Vorbehaltlich der Genehmigung von PEP 525 können wir auch die Erstellung von asynchronen Generator-Ausdrücken zulassen.

Beispiele

  • Mengen-Comprehension: {i async for i in agen()};
  • Listen-Comprehension: [i async for i in agen()];
  • Wörterbuch-Comprehension: {i: i ** 2 async for i in agen()};
  • Generator-Ausdruck: (i ** 2 async for i in agen()).

Es ist erlaubt, async for zusammen mit if und for Klauseln in asynchronen Comprehensions und Generator-Ausdrücken zu verwenden.

dataset = {data for line in aiter()
                async for data in line
                if check(data)}

Asynchrone Comprehensions sind nur innerhalb einer Funktion async def erlaubt.

Grundsätzlich sind asynchrone Generator-Ausdrücke in jedem Kontext erlaubt. In Python 3.6 sind jedoch aufgrund des Status von async und await als Soft-Keywords asynchrone Generator-Ausdrücke nur in einer Funktion async def erlaubt. Sobald async und await in Python 3.7 zu reservierten Schlüsselwörtern werden, wird diese Einschränkung aufgehoben.

await in Comprehensions

Wir schlagen vor, die Verwendung von await-Ausdrücken sowohl in asynchronen als auch in synchronen Comprehensions zu erlauben.

result = [await fun() for fun in funcs]
result = {await fun() for fun in funcs}
result = {fun: await fun() for fun in funcs}

result = [await fun() for fun in funcs if await smth]
result = {await fun() for fun in funcs if await smth}
result = {fun: await fun() for fun in funcs if await smth}

result = [await fun() async for fun in funcs]
result = {await fun() async for fun in funcs}
result = {fun: await fun() async for fun in funcs}

result = [await fun() async for fun in funcs if await smth]
result = {await fun() async for fun in funcs if await smth}
result = {fun: await fun() async for fun in funcs if await smth}

Dies ist nur im Körper einer Funktion async def gültig.

Grammatik-Updates

Der Vorschlag erfordert eine Änderung auf Grammatikebene: das Hinzufügen des optionalen Schlüsselworts „async“ zu comp_for

comp_for: [ASYNC] 'for' exprlist 'in' or_test [comp_iter]

Der AST-Knoten comprehension wird das neue Argument is_async haben.

Abwärtskompatibilität

Der Vorschlag ist vollständig abwärtskompatibel.

Akzeptanz

PEP 530 wurde von Guido am 6. September 2016 angenommen [1].

Implementierung

Die Implementierung wird in Issue 28008 verfolgt [3]. Das Referenzimplementierungs-Git-Repository ist verfügbar unter [2].

Referenzen

Danksagungen

Ich danke Guido van Rossum, Victor Stinner und Elvis Pranskevichus für ihr Feedback, ihre Code-Reviews und Diskussionen rund um diese PEP.


Quelle: https://github.com/python/peps/blob/main/peps/pep-0530.rst

Zuletzt geändert: 2025-02-01 08:59:27 GMT