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

Python Enhancement Proposals

PEP 802 – Display-Syntax für die leere Menge

Autor:
Adam Turner <adam at python.org>
Discussions-To:
Ausstehend
Status:
Entwurf
Typ:
Standards Track
Erstellt:
08-Aug-2025
Python-Version:
3.15
Post-History:
08-Aug-2025

Inhaltsverzeichnis

Zusammenfassung

Wir schlagen eine neue Notation, {/}, vor, um die leere Menge zu konstruieren und darzustellen. Diese ist dem entsprechenden mathematischen Symbol „“ nachempfunden.

Dies ergänzt die bestehende Notation für leere Tupel, Listen und Dictionaries, die (), [] bzw. {} verwenden.

Motivation

Mengen sind derzeit der einzige eingebaute Collection-Typ, der eine Display-Syntax, aber keine Notation zur Darstellung einer leeren Collection hat. Die Python Language Reference erwähnt dies und besagt:

Eine leere Menge kann nicht mit {} konstruiert werden; dieses Literal konstruiert ein leeres Dictionary.

Dies kann für Anfänger verwirrend sein, insbesondere für diejenigen, die von einem wissenschaftlichen oder mathematischen Hintergrund zur Sprache kommen, wo Mengen möglicherweise häufiger verwendet werden als Dictionaries oder Maps.

Eine Syntaxnotation für die leere Menge hat den wichtigen Vorteil, dass keine Namensauflösung erforderlich ist (im Gegensatz zu set()). {/} hat immer eine konsistente Bedeutung und verbessert die Vermittelbarkeit von Kernkonzepten für Anfänger. Zum Beispiel müssen Benutzer darauf achten, set nicht als lokalen Variablennamen zu verwenden, da dies die Erstellung neuer Mengen verhindert. Dies kann frustrierend sein, da Anfänger möglicherweise nicht wissen, wie sie den Typ set wiederherstellen können, wenn sie den Namen überschrieben haben. Techniken dafür (z. B. type({1})) sind nicht sofort ersichtlich, insbesondere für diejenigen, die die Sprache lernen und die Funktion type möglicherweise noch nicht kennen.

Schließlich kann dies für Benutzer hilfreich sein, die kein Englisch sprechen, da es eine kulturunabhängige Notation für eine gängige Datenstruktur bietet, die in die Sprache integriert ist.

Begründung

Mengen wurden in Python 2.2 über PEP 218 eingeführt, die keine Set-Notation enthielt, aber die Idee von {-} für die leere Menge diskutierte.

Die PEP schlug ursprünglich {1,2,3} als Set-Notation und {-} für die leere Menge vor. Die Erfahrungen mit sets.py in Python 2.3 zeigten, dass die Notation nicht notwendig war. Außerdem bestand die Gefahr, dass Dictionaries weniger sofort erkennbar wären.

Python 3.0 führte Set-Literale ein (PEP 3100), wählte aber erneut keine Notation für die leere Menge, die aus pragmatischen Gründen (python-3000, April 2006, python-3000, Mai 2006) weggelassen wurde.

Seitdem wurde das Thema mehrmals diskutiert, mit verschiedenen Vorschlägen, darunter

  1. Ändern Sie {} so, dass es eine leere Menge bedeutet, und verwenden Sie {:} für ein leeres Dictionary (python-ideas, Januar 2008, Discourse, März 2023)
  2. Ein Unicode-Zeichen (z. B. oder ϕ) (python-ideas, April 2021)
  3. <> (python-ideas, November 2010, Discourse, Dezember 2024)
  4. s{} (python-ideas, Juni 2009)
  5. {*()}, vielleicht optimiert, um dies in den BUILD_SET Opcode zu kompilieren (Discourse, August 2025 (#37))
  6. {-} (python-ideas, August 2020)
  7. (/) (Discourse, März 2023 (#20))
  8. {,} (Discourse, August 2025)
  9. {/} (python-ideas, Januar 2008)
  10. set() (d. h. nichts tun)

Die Autoren schlagen {/} als Notation vor, da sie ihrer Meinung nach die beste der angebotenen Optionen ist. Sie ist einfach und prägnant und hat den Vorteil, der mathematischen Notation für die leere Menge, , zu ähneln. Das macht sie zu einer leichteren Eselsbrücke als mehrere in der Sprache, wie ** für Potenzierung oder @ für Matrixmultiplikation.

Die Notation {/} war auch die beliebteste in einer kürzlichen Discourse-Umfrage, die von 41% der Befragten insgesamt und 60% derer, die für eine neue Syntax gestimmt haben, gewählt wurde.

Kurze Zusammenfassungen der anderen Vorschläge finden Sie unter Abgelehnte Ideen.

Spezifikation

Die Grammatik für Set-Literale wird

set_display ::=  "{" ("/" | flexible_expression_list | comprehension) "}"

Der Parser wird eine spezialisierte Fehlermeldung für (/) und [/] ausgeben, die angibt, dass dies ungültige Syntax ist, und die korrekten Formen für leere Tupel bzw. Listen vorschlägt.

{/} wird zur Standard-Syntax für die leere Menge.

>>> type({/})
<class 'set'>
>>> {/} == set()
True

Die Darstellung und Zeichenkettenformen der leeren Menge werden zu '{/}' geändert.

>>> repr({/})
'{/}'
>>> repr(set())
'{/}'
>>> str({/})
'{/}'
>>> str(set())
'{/}'

Es wird keine Verhaltensänderungen bei set-Objekten geben.

Abwärtskompatibilität

Code, der von der repr() oder str() der leeren Menge abhängt, wird nicht mehr funktionieren, da sich die Darstellung ändert.

Es wird keine weiteren rückwärtsinkompatiblen Änderungen geben, alle aktuellen Konstruktoren für die leere Menge werden weiterhin funktionieren, und das Verhalten des Typs set bleibt unverändert.

Aus diesem Grund wird aktueller Code, der set() verwendet, weiterhin funktionieren und kann unverändert bleiben. Entwickler von automatisierten Tools wie Linters und Formatierern sollten es vermeiden, „Aufruhr“ in bestehenden Projekten zu fördern, indem sie Massenänderungen von set() zu {/} vorschlagen, es sei denn, dies wird vom Benutzer solcher Tools ausdrücklich gewünscht.

Sicherheitsimplikationen

Keine.

Wie man das lehrt

Allen Benutzern kann vermittelt werden, dass {/} die neue Schreibweise für set() ist und dass sie in allen anderen Belangen äquivalent ist. Um dies zu unterstützen, werden wir die Dokumentation aktualisieren, um {/} anstelle von set() zu verwenden, einschließlich des Tutorials, der Standardbibliotheksmodule und der Python Language Reference.

Für neue Benutzer können Mengen über die Syntax eingeführt werden, wobei zu beachten ist, dass die vier integrierten Collection-Typen mit Syntax alle leere Formen haben: (), [], {/} und {}.

Die leere Menge verwendet einen Schrägstrich nach vorne, um sie von einem leeren Dictionary zu unterscheiden. Sie verwendet diese Syntax, weil sie dem mathematischen Symbol für die leere Menge (‚‘) ähnelt. Dies kann als hilfreiche Eselsbrücke beim Unterrichten von Anfängern, insbesondere solchen mit mathematischem oder naturwissenschaftlichem Hintergrund, verwendet werden.

Referenzimplementierung

Eine Referenzimplementierung dieser PEP existiert als Pull Request im CPython-Repository auf Github: python/cpython#137565.

Abgelehnte Ideen

Ändern Sie {} so, dass es eine leere Menge bedeutet, und verwenden Sie {:} für ein leeres Dictionary

Dies wäre eine vollständig rückwärtsinkompatible Änderung, alle aktuellen leeren dict-Objekte würden zu Mengen werden.

Verwenden Sie ein Unicode-Zeichen (z. B. oder ϕ)

Das Unicode-Zeichen ‚U+2205 ∅ EMPTY SET‘ ist derzeit kein gültiger Bezeichner. Die Einführung eines Unicode-Zeichens als Syntax wäre schwer zu verwenden, da es auf Standardtastaturen nicht vorkommt.

Die Verwendung anderer Zeichen, die wie ∅ aussehen, wie z. B. ‚U+03C6 ϕ GREEK SMALL LETTER PHI‘ oder ‚U+00D8 Ø LATIN CAPITAL LETTER O WITH STROKE‘, wäre verwirrender mit denselben Nachteilen wie die Verwendung eines Unicode-Zeichens.

Verwenden Sie die <> Syntax

Es hat keine Ähnlichkeit mit der Syntax für nicht-leere Mengen. Dies wäre schwieriger zu erklären als der Vorschlag dieser PEP.

Diese Syntax hat ferner historische Verwendung als Ungleichheitsoperator, der immer noch über from __future__ import barry_as_FLUFL zugänglich ist. Die Verwendung sowohl des barry_as_FLUFL Future-Imports als auch von <> für die leere Menge würde zu Parser-Mehrdeutigkeiten führen: Was würde <> <> <> bedeuten?

Verwenden Sie die s{} Syntax

Diese Syntax kann zu Verwirrung mit s als lokaler Variable führen. Die einzige aktuelle Verwendung von Präfixen dieser Art sind String-Literale. Dies wäre schwieriger zu erklären als der Vorschlag dieser PEP.

Verwenden Sie die {*()} Syntax

Dies beruht auf dem Unpacking eines leeren Tupels in eine Menge, wodurch eine leere Menge erstellt wird. Dies hat den Vorteil der Unterstützung seit Python 3.5 (PEP 448).

Die Erklärung dieser Notation erfordert das Verständnis von Sequenz-Unpacking, dem leeren Tupel, der Set-Literal-Syntax und dem Konzept, eine leere Sequenz zu entpacken, was keine zu entpackenden Werte ergibt.

Dies ist eine umständliche Syntax; keine, die Anfängern leicht vermittelt werden kann. Wir sollten die Einführung komplexer Notationen mit dem Vorbehalt vermeiden, dass Benutzer sie später verstehen oder online nachschlagen können. Dies entzieht dem Lernenden die Handlungsfähigkeit. Insbesondere bei der Verwendung einer Programmiersprache, die beliebigen Code ausführen kann, ist es wichtig, dass die Benutzer verstehen, was der von ihnen geschriebene Code tut.

Nach Meinung der Autoren wäre es ein Fehler, {*()} als Syntax für eine leere Menge zu fördern. Sie entstand als Nebeneffekt von PEP 448 und nicht als bewusste Anstrengung, eine Syntax zu entwerfen, die leicht zu lehren, zu verstehen und zu erklären ist.

Verwenden Sie die {-} Syntax

Diese Syntax wurde ursprünglich in PEP 218 vorgeschlagen, aber vor der Annahme aus der PEP entfernt. Die Autoren bevorzugen {/} aufgrund der Ähnlichkeit mit .

Verwenden Sie die (/) Syntax

Diese Notation wurde als bessere visuelle Ähnlichkeit des Symbols für die leere Menge vorgeschlagen (z. B. U+2205 ∅ EMPTY SET). Sie weicht jedoch vollständig von der regulären Set-Syntax ab. Für die Autoren sind alle vorgeschlagenen Notationen mit geschweiften Klammern besser als dieser Vorschlag, da sie konsistenter mit der aktuellen (seit Python 3.0) Set-Notation sind.

Die Autoren bevorzugen {/}, da sie die Vorteile der visuellen Ähnlichkeit mit dem mathematischen Symbol und der bestehenden Set-Syntax kombiniert, im Gegensatz zu (/).

Verwenden Sie die {,} Syntax

Dies ist die nächstbevorzugte Option der Autoren. Wenn jedoch ein einzelnes Komma zur Darstellung einer leeren Collection verwendet würde, könnte es verwirrend sein, warum dies nicht für leere Tupel oder Listen verwendet werden könnte. Mit der Zeit könnten Vorschläge zur Unterstützung von [,] und (,) kommen. Dies steht im Widerspruch zum allgemeinen Grundsatz, dass „es einen – und vorzugsweise nur einen – offensichtlichen Weg geben sollte, dies zu tun“. Eine sichtbar andere Form, in {/}, hilft, die Idee zu festigen, dass die Syntax für die leere Menge ein Sonderfall ist und keine allgemeine Regel für alle leeren Collections.

Erstellen und verwenden Sie ein neues Token für '{/}'

Es gab frühere Vorschläge, ein neues Token für diese Konstruktion zu erstellen. Dies würde erfordern, dass '{/}' buchstäblich geschrieben wird, ohne Leerzeichen zwischen den Zeichen.

Wir haben uns stattdessen dafür entschieden, Leerzeichen zwischen den Klammern und dem Schrägstrich zuzulassen und {, / und } als drei verschiedene Tokens zu behandeln, da wir keinen Grund sehen, dies zu verhindern. Wir erwarten jedoch, dass die überwiegende Mehrheit der Verwendungen keine Leerzeichen enthält.

Offene Fragen

Keine.

Danksagungen

  • Chris Angelico, Dominykas Grigonis, Ben Hsing, James Webber und andere Mitwirkende an aktuellen Discourse-Themen.
  • Hugo van Kemenade, für hilfreiches Feedback zu einem Entwurf der PEP.

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

Zuletzt geändert: 2025-08-08 20:01:37 GMT