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

Python Enhancement Proposals

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 endet
  • 0 – wenn das zuletzt geschriebene Objekt ein String ist, der mit einem Leerzeichen endet, das weder ein Leerzeichen noch ein Zeilenumbruch ist
  • 1 – 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).

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

Zuletzt geändert: 2025-02-01 08:55:40 GMT