HOWTO · Python

String Builder-Äquivalent in Python

Dieses Tutorial zeigt das Äquivalent der StringBuilder-Klasse in Python

Auf dieser Seite

Python hat keine integrierte Klasse StringBuilder wie manche andere Sprachen. Wähle stattdessen eine Methode zum Erstellen von Zeichenketten, die dazu passt, woher die Teile stammen: str.join() eignet sich für ein Iterable aus Zeichenketten, + für wenige feststehende Teile und io.StringIO, wenn der Code die Teile schrittweise schreibt. F-Strings formatieren Werte zu einer Zeichenkette; sie sind kein allgemeiner Puffer für eine beliebige Folge von Teilen.

Python-Zeichenketten sind unveränderlich: Eine Operation, die ihren Inhalt ändert, erzeugt einen neuen Zeichenkettenwert, statt die ursprüngliche Zeichenkette direkt zu verändern. Das erklärt, weshalb es als allgemeines Muster ungünstig sein kann, wiederholt ein wachsendes Ergebnis aufzubauen. Es bedeutet jedoch nicht, dass jede Verwendung von + langsam ist. Bei einem kleinen, feststehenden Ausdruck ist die Verkettung klar und praktikabel.

Was das Python-Äquivalent zu StringBuilder bedeutet

Eine API nach Art von StringBuilder ist nützlich, wenn ein Programm Text aus vielen Teilen zusammensetzen muss. Python bietet dafür Standardwerkzeuge, aber keine einzelne Klasse, die jeden Anwendungsfall ersetzen sollte. Welche Methode den Code am verständlichsten macht, hängt davon ab, welche Eingaben vorliegen und wie der Text entsteht.

Zeichenketten aus Teilen mit str.join() erstellen

Verwende join() auf der Trennzeichen-Zeichenkette, wenn du bereits ein Iterable aus Zeichenketten hast. Das Trennzeichen steht zwischen benachbarten Elementen; am Anfang und Ende wird keines eingefügt. Zum Beispiel verbindet " / ".join(parts) die Werte mit einem Schrägstrich und jeweils einem Leerzeichen. Jedes Element muss eine Zeichenkette sein. Wandle andere Werte vor dem Verbinden in Zeichenketten um, oder verwende Formatierung, wenn die Werte als Teil einer größeren Nachricht ausgegeben werden sollen.

Führe dieses Beispiel aus. Der Code und die angezeigten Bezeichnungen sowie die Ausgabe bleiben dabei auf Englisch:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

parts = ["docs", "python", "strings"]
path = " / ".join(parts)
print(path)
docs / python / strings

join() ist eine gute Standardwahl, wenn du eine Sammlung bekannter Zeichenketten verbinden möchtest. Damit wird das Trennzeichen ausdrücklich festgelegt und eine Schleife vermieden, die eine Ergebnisvariable wiederholt erweitert. Eine allgemeine Geschwindigkeitsgarantie ist damit nicht verbunden. Wähle die Methode, weil ihre Eingabe und ihr Zweck zur Aufgabe passen.

Wann die Verkettung mit + sinnvoll ist

Verwende +, wenn die Anzahl der Teile klein und feststeht, etwa um eine Begrüßung mit einem Namen zu verbinden oder einem Textzeichen eine Interpunktion anzufügen. Der Ausdruck zeigt die Teile direkt und ist oft einfacher, als nur zum Verbinden erst eine Sammlung anzulegen.

Bei einer Folge, die über viele Schleifendurchläufe entsteht, kann die wiederholte Zuweisung result = result + piece nacheinander neue Zeichenkettenwerte erzeugen und unnötige Arbeit verursachen. Sammle die Zeichenketten stattdessen und verbinde sie einmal, oder verwende StringIO, wenn jeder Teil beim Entstehen direkt geschrieben werden kann. Die tatsächliche Leistung hängt vom Programm und der Python-Implementierung ab. Vermeide daher eine unbelegte allgemeine Rangfolge der Methoden.

io.StringIO für schrittweises Schreiben verwenden

Wenn der Code Text in mehreren Schritten erzeugt, stellt io.StringIO einen Textdatenstrom im Speicher mit einer write()-Methode bereit. Importiere ihn aus io, schreibe jeden Zeichenketten-Teil hinein und rufe anschließend getvalue() auf, um die zusammengesetzte Zeichenkette abzurufen. Das kann Code, der Ausgaben erzeugt, übersichtlicher machen, wenn die Teile aus verschiedenen Zweigen oder Schritten stammen. Jedes Argument für write() muss eine Zeichenkette sein. Ein Kontextmanager kann den Gültigkeitsbereich des Datenstroms verdeutlichen; falls du den fertigen Wert danach noch brauchst, rufe getvalue() auf, bevor du diesen Bereich verlässt.

Der folgende Code und die angezeigten Bezeichnungen sowie die Ausgabe bleiben auf Englisch:

from io import StringIO

with StringIO() as output:
    output.write("Hello")
    output.write(", ")
    output.write("Python")
    message = output.getvalue()

print(message)
Hello, Python

Ein eigener Wrapper ist meist unnötig. Falls eine Anwendung einen benötigt, sollte der Puffer zu jeder Instanz gehören, damit verschiedene Builder keinen gemeinsamen Zustand haben.

Werte mit F-Strings formatieren

Verwende einen F-String, wenn Werte in eine Zeichenkette formatiert werden sollen. Ausdrücke in geschweiften Klammern werden ausgewertet und für die Ausgabe umgewandelt. So bleibt eine kurze Nachricht gut lesbar:

Der folgende Code und die angezeigten Bezeichnungen sowie die Ausgabe bleiben auf Englisch:

name = "Ada"
count = 3
message = f"{name} has {count} tasks."
print(message)

F-Strings dienen der Interpolation und nicht dazu, eine beliebige Sammlung von Teilen schrittweise anzuhängen. Wenn die Werte in einer Sammlung vorliegen, bereite Zeichenkettenelemente vor und verwende join(). Wird der Text schrittweise geschrieben, kommt StringIO infrage. So bleiben Formatierung und Zusammensetzen voneinander getrennt.

Die passende Methode zum Erstellen von Zeichenketten wählen

  • Verwende str.join(), wenn du ein Iterable aus Zeichenketten hast und dazwischen ein Trennzeichen einfügen möchtest.
  • Verwende + für wenige, feststehende und direkt erkennbare Teile.
  • Verwende io.StringIO, wenn Text schrittweise über eine datenstromähnliche Schnittstelle geschrieben wird.
  • Verwende einen F-String, um einige Werte in eine Nachricht oder eine andere formatierte Zeichenkette einzusetzen.

Es gibt kein einzelnes Python-Äquivalent zu StringBuilder, das für jede Situation passt. Richte die Methode danach aus, wie die Teile bereitgestellt werden, und wandle Werte in Zeichenketten um, wenn die gewählte Operation Zeichenketten als Eingabe erwartet. Mit diesen Methoden lässt sich Text praktisch zusammensetzen, ohne pauschal zu behaupten, eine davon sei immer am schnellsten.