PEP 3125 – Entfernen der Backslash-Fortsetzung
- Autor:
- Jim J. Jewett <JimJJewett at gmail.com>
- Status:
- Abgelehnt
- Typ:
- Standards Track
- Erstellt:
- 29. Apr. 2007
- Post-History:
- 29. April 2007, 30. April 2007, 04. Mai 2007
Ablehnungsbescheid
Dieser PEP wurde abgelehnt. Es gab nicht genügend Unterstützung dafür, das zu entfernende Merkmal ist nicht so schädlich, und es gibt einige Anwendungsfälle, die dadurch erschwert würden.
Zusammenfassung
Python hat seine Syntaxanalyse ursprünglich von C geerbt. Obwohl dies im Allgemeinen nützlich war, gibt es einige Überbleibsel, die für Python weniger nützlich waren und beseitigt werden sollten.
Dieser PEP schlägt die Eliminierung von terminalem \ als Markierung für die Zeilenfortsetzung vor.
Motivation
Ein Ziel für Python 3000 sollte es sein, die Sprache zu vereinfachen, indem unnötige oder doppelte Funktionen entfernt werden. Es gibt derzeit mehrere Möglichkeiten, anzuzeigen, dass eine logische Zeile in der folgenden physischen Zeile fortgesetzt wird.
Die anderen Fortsetzungsmethoden werden leicht als logische Konsequenz der von ihnen bereitgestellten Semantik erklärt; \ ist einfach ein Escape-Zeichen, das auswendig gelernt werden muss.
Bestehende Methoden zur Zeilenfortsetzung
Klammerausdruck - ([{}])
Öffnen Sie einen klammerigen Ausdruck. Es spielt keine Rolle, ob die Leute die "Zeile" als fortgesetzt betrachten; sie erkennen sofort, dass der Ausdruck geschlossen werden muss, bevor die Anweisung enden kann.
Beispiele für die Verwendung von (), [] und {}
def fn(long_argname1,
long_argname2):
settings = {"background": "random noise",
"volume": "barely audible"}
restrictions = ["Warrantee void if used",
"Notice must be received by yesterday",
"Not responsible for sales pitch"]
Beachten Sie, dass es immer möglich ist, einen Ausdruck in Klammern zu setzen, aber es kann seltsam erscheinen, einen Ausdruck in Klammern zu setzen, der nur für den Zeilenumbruch Klammern benötigt.
assert val>4, (
"val is too small")
Dreifach-Anführungszeichen-Strings
Öffnen Sie einen String mit dreifachen Anführungszeichen; auch hier erkennen die Leute, dass der String beendet werden muss, bevor die nächste Anweisung beginnt.
banner_message = """
Satisfaction Guaranteed,
or DOUBLE YOUR MONEY BACK!!!
some minor restrictions apply"""
Terminales \ im Allgemeinen Fall
Ein terminales \ zeigt an, dass die logische Zeile in der folgenden physischen Zeile fortgesetzt wird (nach Leerzeichen). Damit sind keine besonderen Semantiken verbunden. Diese Form ist niemals erforderlich, obwohl sie in einigen Fällen besser aussehen kann (insbesondere für Leute mit Hintergrund in der C-Sprache).
>>> assert val>4, \
"val is too small"
Beachten Sie auch, dass das \ das letzte Zeichen in der Zeile sein muss. Wenn Ihr Editor-Navigationssystem am Ende einer Zeile Leerzeichen hinzufügen kann, ändert diese unsichtbare Änderung die Semantik des Programms. Glücklicherweise ist das typische Ergebnis nur ein Syntaxfehler und kein Laufzeitfehler.
>>> assert val>4, \
"val is too small"
SyntaxError: unexpected character after line continuation character
Dieser PEP schlägt vor, diese redundante und potenziell verwirrende Alternative zu eliminieren.
Terminales \ innerhalb eines Strings
Ein terminales \ innerhalb eines Strings mit einfachen Anführungszeichen am Ende der Zeile. Dies ist wohl ein Sonderfall des terminalen \, aber es ist ein Sonderfall, der beibehalten werden könnte.
>>> "abd\
def"
'abd def'
- Dafür: Viele der Einwände gegen die Entfernung der
\-Fortsetzung waren eigentlich nur Einwände gegen die Entfernung innerhalb von Literal-Strings; mehrere Leute klärten, dass sie diese Literal-String-Verwendung beibehalten möchten, aber es ihnen nichts ausmacht, den allgemeinen Fall zu verlieren. - Dafür: Die Verwendung von
\als Escape-Zeichen innerhalb von Strings ist bekannt. - Dagegen: Aber beachten Sie, dass diese spezielle Verwendung seltsam ist, da das maskierte Zeichen (der Zeilenumbruch) unsichtbar ist und die Sonderbehandlung darin besteht, das Zeichen zu löschen. Abgesehen davon ist der
\von\(Zeilenumbruch)immer noch ein Escape, das die Bedeutung des folgenden Zeichens ändert.
Alternative Vorschläge
Mehrere Personen haben alternative Möglichkeiten zur Markierung des Zeilenendes vorgeschlagen. Die meisten davon wurden abgelehnt, da sie die Dinge nicht wirklich vereinfachten.
Die einzige Ausnahme war, jedes unvollständige Statement als Zeilenfortsetzung zu interpretieren, möglicherweise in Verbindung mit erhöhter Einrückung.
Dies ist attraktiv, da es eine Verallgemeinerung der Regel für Klammern ist.
Die anfänglichen Einwände dagegen waren
- Der Whitespace-Betrag kann strittig sein; die Fortsetzung von Ausdrücken sollte nicht mit dem Öffnen einer neuen Suite verwechselt werden.
- Die "Ausdrucksfortsetzungs"-Marker sind in Python nicht so deutlich gekennzeichnet wie die Gruppierungssatzzeichen "(), [], {}".
# Plus needs another operand, so the line continues "abc" + "def" # String ends an expression, so the line does not # not continue. The next line is a syntax error because # unary plus does not apply to strings. "abc" + "def"
- Guido widersprach aus technischen Gründen. [1] Die offensichtlichste Implementierung würde die Zulassung von INDENT- oder DEDENT-Tokens überall oder zumindest in einem stark erweiterten (und schlecht definierten) Satz von Speicherorten erfordern. Obwohl dies nur den internen Parsing-Mechanismus betrifft (und nicht die Benutzer), wäre es eine erhebliche neue Quelle für Komplexität.
Andrew Koenig wies dann [2] auf eine bessere Implementierungsstrategie hin und sagte, dass diese in anderen Sprachen gut funktioniert habe. [3] Der verbesserte Vorschlag lief darauf hinaus:
Der Whitespace, der einem (Operator oder) offenen Klammer- oder runde Klammerzeichen folgt, kann Zeilenumbruchzeichen enthalten.Dies würde auf einer sehr niedrigen lexikalischen Ebene implementiert werden – noch bevor die Entscheidung getroffen wird, einen Zeilenumbruch gefolgt von Leerzeichen in ein INDENT- oder DEDENT-Token umzuwandeln.
Es besteht weiterhin die Sorge, dass dies Fehler maskieren könnte, wie in diesem Beispiel [4]
# Used to be y+1, the 1 got dropped. Syntax Error (today)
# would become nonsense.
x = y+
f(x)
Die Anforderung, dass die Fortsetzung stärker eingerückt ist als die ursprüngliche Zeile, würde sowohl Sicherheit als auch Komplexität hinzufügen.
Offene Fragen
- Sollte die
\-Fortsetzung auch innerhalb von Strings entfernt werden? - Sollten die Fortsetzungsmarker von nur ([{}]) auf Zeilen erweitert werden, die mit einem Operator enden?
- Sollte als Sicherheitsmaßnahme die Fortsetzungszeile stärker eingerückt sein als die ursprüngliche Zeile?
Referenzen
Urheberrecht
Dieses Dokument wurde gemeinfrei erklärt.
Quelle: https://github.com/python/peps/blob/main/peps/pep-3125.rst
Zuletzt geändert: 2025-02-01 08:59:27 GMT