PEP 259 – Unterdrücken des Druckens von Zeilenumbrüchen nach Zeilenumbrüchen
- Autor:
- Guido van Rossum <guido at python.org>
- Status:
- Abgelehnt
- Typ:
- Standards Track
- Erstellt:
- 11. Juni 2001
- Python-Version:
- 2.2
- Post-History:
- 11. Juni 2001
Inhaltsverzeichnis
Zusammenfassung
Derzeit fügt die print-Anweisung immer einen Zeilenumbruch hinzu, es sei denn, es wird ein nachgestelltes Komma verwendet. Das bedeutet, dass wir, wenn wir Daten drucken wollen, die bereits mit einem Zeilenumbruch enden, zwei Zeilenumbrüche erhalten, es sei denn, es werden spezielle Vorkehrungen getroffen.
Ich schlage vor, das Drucken des Zeilenumbruchs zu überspringen, wenn er auf einen Zeilenumbruch folgt, der aus Daten stammt.
Um zu vermeiden, dass noch eine weitere magische Variable zu Dateiobjekten hinzugefügt werden muss, schlage ich vor, der vorhandenen 'softspace'-Variablen eine zusätzliche Bedeutung zu geben: Ein negativer Wert bedeutet "die zuletzt geschriebenen Daten endeten mit einem Zeilenumbruch, daher ist kein Leerzeichen oder Zeilenumbruch erforderlich."
Problem
Beim Drucken von Daten, die den Zeilen ähneln, die mit einer einfachen Schleife aus einer Datei gelesen wurden, tritt eine Doppelleerzeile auf, es sei denn, es werden spezielle Vorkehrungen getroffen.
>>> for line in open("/etc/passwd").readlines():
... print line
...
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
(etc.)
>>>
Obwohl es einfache Workarounds gibt, wird dies oft erst während des Testens bemerkt und erfordert eine zusätzliche Editier-Test-Rundfahrt; der korrigierte Code ist unschöner und schwieriger zu warten.
Vorgeschlagene Lösung
Im PRINT_ITEM-Opcode in ceval.c wird beim Drucken eines String-Objekts bereits eine Prüfung durchgeführt, die das letzte Zeichen dieses Strings betrachtet. Derzeit wird das Softspace-Flag auf Null zurückgesetzt, wenn dieses letzte Zeichen ein Leerzeichen ist, das kein Leerzeichen ist; dies unterdrückt das Leerzeichen zwischen zwei Elementen, wenn das erste Element ein String ist, der mit einem Zeilenumbruch, Tabulator usw. endet (aber nicht, wenn er mit einem Leerzeichen endet). Andernfalls wird das Softspace-Flag auf eins gesetzt.
Der Vorschlag ändert diesen Test leicht, so dass Softspace wie folgt gesetzt wird:
-1– wenn das zuletzt geschriebene Objekt ein String ist, der mit einem Zeilenumbruch endet0– wenn das zuletzt geschriebene Objekt ein String ist, der mit einem Leerzeichen endet, das weder ein Leerzeichen noch ein Zeilenumbruch ist1– in allen anderen Fällen (einschließlich des Falls, wenn das zuletzt geschriebene Objekt ein leerer String ist oder kein String ist)
Dann wird im PRINT_NEWLINE-Opcode das Drucken des Zeilenumbruchs unterdrückt, wenn der Wert von softspace negativ ist; in jedem Fall wird das softspace-Flag auf Null zurückgesetzt.
Umfang
Dies betrifft nur das Drucken von 8-Bit-Strings. Es betrifft kein Unicode, obwohl dies als Fehler in der Unicode-Implementierung betrachtet werden könnte. Es betrifft keine anderen Objekte, deren String-Darstellung zufällig mit einem Zeilenumbruchszeichen endet.
Risiken
Diese Änderung bricht vorhandenen Code. Zum Beispiel
print "Subject: PEP 259\n"
print message_body
Im aktuellen Python erzeugt dies eine leere Zeile, die das Thema vom Nachrichtenkörper trennt; mit der vorgeschlagenen Änderung beginnt der Körper unmittelbar unter dem Thema. Dies ist ohnehin kein sehr robuster Code; es ist besser geschrieben als
print "Subject: PEP 259"
print
print message_body
In der Testsuite bricht nur test_StringIO (die dieses Feature explizit testet).
Implementierung
Ein Patch im Verhältnis zum aktuellen CVS ist hier
http://sourceforge.net/tracker/index.php?func=detail&aid=432183&group_id=5470&atid=305470
Abgelehnt
Die Benutzergemeinschaft hat dies einstimmig abgelehnt, daher werde ich diese Idee nicht weiter verfolgen. Häufig gehörte Argumente dagegen waren:
- Es wird wahrscheinlich Tausende von CGI-Skripten brechen.
- Genug Magie schon (außerdem: keine weiteren Basteleien an 'print' mehr, bitte).
Urheberrecht
Dieses Dokument wurde gemeinfrei erklärt.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0259.rst
Zuletzt geändert: 2025-02-01 08:55:40 GMT