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
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.
Urheberrecht
Dieses Dokument wurde gemeinfrei erklärt.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0530.rst
Zuletzt geändert: 2025-02-01 08:59:27 GMT