Was ist der richtige Einzug für mehrzeilige Python-Zeichenfolgen innerhalb einer Funktion?
def method():
string = """line one
line two
line three"""
oder
def method():
string = """line one
line two
line three"""
oder etwas anderes?
Es sieht irgendwie komisch aus, wenn die Zeichenfolge im ersten Beispiel außerhalb der Funktion hängt.
method.__doc__
wird von Python selbst nicht mehr als jedes anderestr
Literal geändert .Antworten:
Sie möchten sich wahrscheinlich mit dem ausrichten
"""
Da die Zeilenumbrüche und Leerzeichen in der Zeichenfolge selbst enthalten sind, müssen Sie sie nachbearbeiten. Wenn Sie dies nicht möchten und viel Text haben, können Sie ihn separat in einer Textdatei speichern. Wenn eine Textdatei für Ihre Anwendung nicht gut funktioniert und Sie nicht nachbearbeiten möchten, würde ich wahrscheinlich mitmachen
Wenn Sie eine mehrzeilige Zeichenfolge nachbearbeiten möchten, um die nicht benötigten Teile zu
textwrap
entfernen, sollten Sie das in PEP 257 vorgestellte Modul oder die Technik für die Nachbearbeitung von Dokumentzeichenfolgen berücksichtigen :quelle
trim()
in PEP257 angegebene Funktion ist in der Standardbibliothek als implementiertinspect.cleandoc
.string
intext
oder etwas anderes ändern , müssen Sie jetzt die Einrückung buchstäblich jeder einzelnen Zeile der Zeile aktualisieren mehrzeiliger String, nur damit er mit dem"""
richtigen übereinstimmt . Die Einrückungsstrategie sollte zukünftige Refaktoren / Wartungsarbeiten nicht erschweren, und dies ist einer der Orte, an denen PEP wirklich versagtDie
textwrap.dedent
Funktion ermöglicht es, mit der korrekten Einrückung in der Quelle zu beginnen und diese dann vor der Verwendung aus dem Text zu entfernen.Der Kompromiss besteht, wie einige andere bemerkten, darin, dass dies ein zusätzlicher Funktionsaufruf für das Literal ist; Berücksichtigen Sie dies, wenn Sie entscheiden, wo diese Literale in Ihrem Code platziert werden sollen.
Das Nachlaufen
\
im Protokollnachrichtenliteral soll sicherstellen, dass der Zeilenumbruch nicht im Literal enthalten ist. Auf diese Weise beginnt das Literal nicht mit einer Leerzeile, sondern mit der nächsten vollständigen Zeile.Der Rückgabewert von
textwrap.dedent
ist die Eingabezeichenfolge, bei der alle gemeinsamen führenden Leerzeicheneinrückungen in jeder Zeile der Zeichenfolge entfernt werden. Der obigelog_message
Wert lautet also:quelle
textwrap.dedent()
Aufrufs genau wie sein Eingabeargument ein konstanter Wert ist.def foo: return foo.x
dann nächste Zeilefoo.x = textwrap.dedent("bar")
.Verwenden Sie
inspect.cleandoc
wie folgt:Die relative Einrückung wird wie erwartet beibehalten. Verwenden Sie, wie unten kommentiert , wenn Sie vorhergehende Leerzeilen beibehalten möchten
textwrap.dedent
. Damit bleibt aber auch der erste Zeilenumbruch erhalten.quelle
inspect.cleandoc
existiert sie seit Python 2.6 , das war 2008 ..? Absolut die sauberste Antwort, vor allem, weil sie nicht den Stil des hängenden Einzugs verwendet, der nur unnötig viel PlatzEine Option, die in den anderen Antworten zu fehlen scheint (nur tief unten in einem Kommentar von naxa erwähnt), ist die folgende:
Dies ermöglicht eine korrekte Ausrichtung, verbindet die Linien implizit und behält dennoch die Linienverschiebung bei, was für mich einer der Gründe ist, warum ich sowieso mehrzeilige Zeichenfolgen verwenden möchte.
Es ist keine Nachbearbeitung erforderlich, aber Sie müssen die
\n
an einer bestimmten Stelle, an der die Zeile enden soll , manuell hinzufügen . Entweder inline oder als separater String danach. Letzteres lässt sich leichter kopieren und einfügen.quelle
Einige weitere Optionen. In Ipython mit aktiviertem Pylab befindet sich dedent bereits im Namespace. Ich habe nachgesehen und es ist von matplotlib. Oder es kann importiert werden mit:
In der Dokumentation heißt es, dass es schneller ist als das Textwrap-Äquivalent und in meinen Tests in Ipython ist es mit meinen Schnelltests im Durchschnitt dreimal schneller. Es hat auch den Vorteil, dass alle führenden Leerzeilen verworfen werden, sodass Sie beim Erstellen der Zeichenfolge flexibel sein können:
Die Verwendung der Matplotlib für diese drei Beispiele führt zu demselben vernünftigen Ergebnis. Die Textwrap-Dedent-Funktion hat eine führende Leerzeile mit dem ersten Beispiel.
Offensichtlicher Nachteil ist, dass sich Textwrap in der Standardbibliothek befindet, während matplotlib ein externes Modul ist.
Einige Kompromisse hier ... Die dedent-Funktionen machen Ihren Code besser lesbar, wenn die Zeichenfolgen definiert werden, müssen jedoch später verarbeitet werden, um die Zeichenfolge in einem verwendbaren Format zu erhalten. In Docstrings ist es offensichtlich, dass Sie den richtigen Einzug verwenden sollten, da die meisten Verwendungen des Docstrings die erforderliche Verarbeitung ausführen.
Wenn ich eine nicht lange Zeichenfolge in meinem Code benötige, finde ich den folgenden zugegebenermaßen hässlichen Code, in dem ich die lange Zeichenfolge aus dem einschließenden Einzug herausfallen lasse. Scheitert definitiv an "Schön ist besser als hässlich", aber man könnte argumentieren, dass es einfacher und expliziter ist als die dedizierte Alternative.
quelle
Wenn Sie eine schnelle und einfache Lösung wünschen und sich das Eingeben von Zeilenumbrüchen ersparen möchten, können Sie sich stattdessen für eine Liste entscheiden, z.
quelle
ich bevorzuge
oder
quelle
Meine zwei Cent entkommen dem Zeilenende, um die Einrückungen zu erhalten:
quelle
Ich bin hierher gekommen, um nach einem einfachen 1-Liner zu suchen, mit dem die Identifikationsstufe des Dokumentstrings zum Drucken entfernt / korrigiert werden kann , ohne dass er unordentlich aussieht , indem er beispielsweise im Skript "außerhalb der Funktion hängt".
Folgendes habe ich getan:
Wenn Sie anstelle der Tabulatortaste Leerzeichen (z. B. 4) einrücken, verwenden Sie stattdessen Folgendes:
Und Sie müssen das erste Zeichen nicht entfernen, wenn Ihre Dokumentzeichenfolgen stattdessen so aussehen sollen:
quelle
Die erste Option ist die gute - mit Einrückung. Es ist im Python-Stil - bietet Lesbarkeit für den Code.
So zeigen Sie es richtig an:
quelle
Dies hängt davon ab, wie der Text angezeigt werden soll. Wenn Sie möchten, dass alles linksbündig ausgerichtet ist, formatieren Sie es entweder wie im ersten Snippet oder durchlaufen Sie die Zeilen, die den gesamten Raum nach links kürzen.
quelle
Für Zeichenfolgen können Sie die Zeichenfolge direkt nach der Verarbeitung verarbeiten. Für Docstrings müssen Sie stattdessen die Funktion nachbearbeiten. Hier ist eine Lösung für beide, die noch lesbar ist.
quelle
inspect.cleandoc
- die dies richtig machen.Ich habe ein ähnliches Problem, Code wurde mit Multilines wirklich unlesbar, ich kam mit so etwas heraus
Ja, am Anfang könnte es schrecklich aussehen, aber die eingebettete Syntax war ziemlich komplex und das Hinzufügen von etwas am Ende (wie '\ n "') war keine Lösung
quelle
Sie können diese Funktion trim_indent verwenden .
Ergebnis:
quelle