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

Python Enhancement Proposals

PEP 515 – Unterstriche in numerischen Literalen

Autor:
Georg Brandl, Serhiy Storchaka
Status:
Final
Typ:
Standards Track
Erstellt:
10-Feb-2016
Python-Version:
3.6
Post-History:
10-Feb-2016, 11-Feb-2016

Inhaltsverzeichnis

Abstrakt und Begründung

Diese PEP schlägt vor, die Syntax von Python und die Konstruktoren zum Umwandeln von Zeichenketten in Zahlen zu erweitern, sodass Unterstriche als visuelle Trennzeichen zur Gruppierung von Ziffern in ganzzahligen, Gleitkomma- und komplexen Zahlenliteralen verwendet werden können.

Dies ist ein häufiges Merkmal anderer moderner Sprachen und kann die Lesbarkeit langer Literale oder von Literalen, deren Wert klar in Teile aufgeteilt werden sollte (wie z. B. Bytes oder Wörter in hexadezimaler Notation), verbessern.

Beispiele

# grouping decimal numbers by thousands
amount = 10_000_000.0

# grouping hexadecimal addresses by words
addr = 0xCAFE_F00D

# grouping bits into nibbles in a binary literal
flags = 0b_0011_1111_0100_1110

# same, for string conversions
flags = int('0b_1111_0000', 2)

Spezifikation

Der aktuelle Vorschlag ist, einen Unterstrich zwischen Ziffern und nach Basispräfixen in numerischen Literalen zuzulassen. Die Unterstriche haben keine semantische Bedeutung, und Literale werden so interpretiert, als wären die Unterstriche nicht vorhanden.

Grammatik von Literalen

Die Produktionsliste für Ganzzahl-Literale würde daher wie folgt aussehen

integer: decinteger | bininteger | octinteger | hexinteger
decinteger: nonzerodigit (["_"] digit)* | "0" (["_"] "0")*
bininteger: "0" ("b" | "B") (["_"] bindigit)+
octinteger: "0" ("o" | "O") (["_"] octdigit)+
hexinteger: "0" ("x" | "X") (["_"] hexdigit)+
nonzerodigit: "1"..."9"
digit: "0"..."9"
bindigit: "0" | "1"
octdigit: "0"..."7"
hexdigit: digit | "a"..."f" | "A"..."F"

Für Gleitkomma- und komplexe Literale

floatnumber: pointfloat | exponentfloat
pointfloat: [digitpart] fraction | digitpart "."
exponentfloat: (digitpart | pointfloat) exponent
digitpart: digit (["_"] digit)*
fraction: "." digitpart
exponent: ("e" | "E") ["+" | "-"] digitpart
imagnumber: (floatnumber | digitpart) ("j" | "J")

Konstruktoren

Nach den gleichen Regeln für die Platzierung sind Unterstriche in den folgenden Konstruktoren zulässig

  • int() (mit beliebiger Basis)
  • float()
  • complex()
  • Decimal()

Weitere Änderungen

Die neue numerische Formatierungssprache wird um _ als Tausendertrennzeichen erweitert, wo derzeit nur , unterstützt wird. Dies kann verwendet werden, um leicht lesbaren Code mit besser lesbaren Literalen zu generieren. [11]

Die Syntax wäre die gleiche wie für das Komma, z. B. {:10_} für eine Breite von 10 mit _ als Trennzeichen.

Für die Formatierungsbezeichner b, x und o ist _ zulässig und gruppiert nach 4 Ziffern.

Vorhandene Lösungen

Die Sprachen, die eine Unterstrichgruppierung zulassen, implementieren eine große Vielfalt von Regeln für die zulässige Platzierung von Unterstrichen. In Fällen, in denen die Sprachspezifikation vom tatsächlichen Verhalten abweicht, wird das tatsächliche Verhalten aufgeführt. ("einzeln" oder "mehrere" bezieht sich auf das Zulassen von aufeinanderfolgenden Unterstrichen.)

  • Ada: einzeln, nur zwischen Ziffern [8]
  • C# (offener Vorschlag für 7.0): mehrere, nur zwischen Ziffern [6]
  • C++14: einzeln, zwischen Ziffern (anderes Trennzeichen gewählt) [1]
  • D: mehrere, überall, einschließlich am Ende [2]
  • Java: mehrere, nur zwischen Ziffern [7]
  • Julia: einzeln, nur zwischen Ziffern (aber nicht in Exponententeilen von Gleitkommazahlen) [9]
  • Perl 5: mehrere, im Grunde überall, obwohl die Dokumentation besagt, dass es auf einen Unterstrich zwischen Ziffern beschränkt ist [3]
  • Ruby: einzeln, nur zwischen Ziffern (obwohl die Dokumentation "überall" besagt) [10]
  • Rust: mehrere, überall, außer zwischen "e" und Ziffern des Exponenten [4]
  • Swift: mehrere, zwischen Ziffern und am Ende (obwohl die textuelle Beschreibung nur "zwischen Ziffern" besagt) [5]

Alternative Syntax

Regeln für die Platzierung von Unterstrichen

Anstelle der relativ strengen oben angegebenen Regel könnte die Verwendung von Unterstrichen weniger eingeschränkt sein. Wie in anderen Sprachen zu sehen, sind gängige Regeln:

  • Nur ein aufeinanderfolgender Unterstrich erlaubt, und nur zwischen Ziffern.
  • Mehrere aufeinanderfolgende Unterstriche erlaubt, aber nur zwischen Ziffern.
  • Mehrere aufeinanderfolgende Unterstriche erlaubt, an den meisten Stellen außer am Anfang des Literals oder an speziellen Stellen wie nach einem Dezimalpunkt.

Die Syntax in dieser PEP wurde letztendlich ausgewählt, weil sie die gängigen Anwendungsfälle abdeckt und keine Syntax zulässt, die in Stilrichtlinien ohnehin abgeraten werden müsste.

Eine weniger verbreitete Regel wäre, Unterstriche nur alle N Ziffern zuzulassen (wobei N 3 für Dezimalzahlen und 4 für hexadezimale Zahlen sein könnte). Dies ist unnötig einschränkend, insbesondere angesichts der Tatsache, dass die Platzierung von Trennzeichen in verschiedenen Kulturen unterschiedlich ist.

Unterschiedliche Trennzeichen

Eine vorgeschlagene alternative Syntax war die Verwendung von Leerzeichen zur Gruppierung. Obwohl Zeichenketten ein Präzedenzfall für die Kombination von aneinandergereihten Literalen sind, kann das Verhalten zu unerwarteten Effekten führen, die mit Unterstrichen nicht möglich sind. Außerdem ist keine andere Sprache bekannt, die diese Regel verwendet, außer Sprachen, die Leerzeichen generell ignorieren.

C++14 führt Apostrophe zur Gruppierung ein (da Unterstriche Mehrdeutigkeit mit benutzerdefinierten Literalen einführen), was nicht berücksichtigt wird, da sie in Pythons Zeichenkettenliteralen verwendet werden. [1]

Implementierung

Ein vorläufiger Patch, der die oben genannte Spezifikation implementiert, wurde im Issue-Tracker veröffentlicht. [12]

Referenzen


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

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