Mehrzeiliger F-String in Python


80

Ich versuche, PEP-8-kompatiblen Code für ein inländisches Projekt zu schreiben (ich muss zugeben, dass dies meine ersten Schritte in der Python-Welt sind), und ich habe einen F-String, der mehr als 80 Zeichen lang ist

- Die durchgezogene dünne Linie in der Nähe des Punktes bei self.text ist die 80-Zeichen-Marke. (Entschuldigung für den traurigen Link ohne Vorschau, aber ich muss mehr als 10 Mitarbeiter haben, um sie zu posten)

Ich versuche es auf pythonischste Weise in verschiedene Zeilen aufzuteilen , aber die einzige Antwort, die tatsächlich funktioniert, ist ein Fehler für meinen Linter

Arbeitscode:

def __str__(self):
    return f'{self.date} - {self.time},\nTags:' + \
    f' {self.tags},\nText: {self.text}'

Ausgabe:

2017-08-30 - 17:58:08.307055,
Tags: test tag,
Text: test text

Der Linter glaubt, dass ich E122 von PEP-8 nicht respektiere. Gibt es eine Möglichkeit, die Zeichenfolge richtig und den Code konform zu machen?


1
oder sagen Sie einfach Ihrer Idee, dass sie das Zeilenzeichenlimit erhöhen oder diese Regel alle zusammen ignorieren soll
Joran Beasley,

21
Ich glaube nicht, dass es ein Betrug ist. fSaiten werden dort nicht diskutiert.
Ma0

3
@JoshLee "E122 Fortsetzungszeile fehlt Einrückung oder veraltete Hauptleitung" auch warum haben Sie die Frage geschlossen? Es gibt keine Duplikate, es ist das einzige über mehrzeilige F-Strings
Owlzy

2
@Owlzy Ist die Antwort nicht genau dieselbe: Verwenden Sie Klammern, nicht den Zeilenfortsetzungsmarker?
Nick T

8
Diese Frage hätte niemals als Betrüger geschlossen werden dürfen, da der verknüpfte "Betrüger" kein Betrüger dieser Frage ist. Stackoverflow-Power-User, von denen Sie wissen, dass wir ein Problem damit haben, zu aggressiv zu sein, lassen Sie es erneut öffnen. Abgabe einer erneuten Abstimmung so schnell wie möglich.
Urda

Antworten:


87

Aus dem Style Guide für Python-Code :

Die bevorzugte Methode zum Umschließen langer Zeilen ist die Verwendung der impliziten Zeilenfortsetzung von Python in Klammern, Klammern und Klammern.

In Anbetracht dessen würde das Folgende Ihr Problem auf eine PEP-8-konforme Weise lösen.

return (
    f'{self.date} - {self.time}\n'
    f'Tags: {self.tags}\n'
    f'Text: {self.text}'
)

Python-Zeichenfolgen werden automatisch verkettet, wenn sie nicht durch ein Komma getrennt sind, sodass Sie nicht explizit aufrufen müssen join().


37

Ich denke es wäre

return f'''{self.date} - {self.time},
Tags: {self.tags},
Text: {self.text}'''

Jetzt, da es geschlossen ist, kann ich diese Antwort löschen, wenn die Leute denken, ich sollte ... aber es ist nicht in der betrogenen Antwort enthalten: / \
Joran Beasley

8
Aber diese Art von Multiline besiegt den Zweck von F-Strings und Einrückungen. Auch ich glaube nicht, dass dies die richtige Verwendung der Triple-
Quote-

2
Während diese Antwort die Absicht des OP wiederholt, denke ich, dass die Antwort von @ noddy besser ist. Diese Antwort ist einfach richtig, weil das OP auch mehrzeilig in der Ausgabe haben wollte. Wenn Sie möchten, dass die Ausgabe ein anderes Layout als der Quellcode hat, sind dreifache Anführungszeichen nicht der richtige Weg.
Mike Williamson

8

Sie können entweder dreifache einfache Anführungszeichen oder dreifache doppelte Anführungszeichen verwenden, aber am Anfang der Zeichenfolge ein f einfügen:

Dreifache einfache Anführungszeichen

return f'''{self.date} - {self.time},
Tags:' {self.tags},
Text: {self.text}'''

Dreifache doppelte Anführungszeichen

return f"""{self.date} - {self.time},
Tags:' {self.tags},
Text: {self.text}"""

Beachten Sie, dass Sie "\ n" nicht verwenden müssen, da Sie eine mehrzeilige Zeichenfolge verwenden.


6

Wie von @noddy erwähnt, funktioniert der Ansatz auch für den Ausdruck der Variablenzuweisung:

var1 = "foo"
var2 = "bar"
concat_var = (f"First var is: {var1}"
              f" and in same line Second var is: {var2}")
print(concat_var)

sollte dir geben:

First var is: foo and in same line Second var is: bar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.