Wielowierszowy f-string w Pythonie

86

Próbuję napisać kod zgodny z PEP-8 do krajowego projektu (muszę przyznać, że to moje pierwsze kroki w świecie Pythona) i mam f-string o długości ponad 80 znaków

- ciągła cienka linia w pobliżu kropki w self.text to znak 80 znaków. (Przepraszamy za smutny link bez podglądu, ale muszę mieć ponad 10 przedstawicieli, aby je opublikować)

Próbuję podzielić to na różne linie w najbardziej pytoniczny sposób, ale jedyną odpowiedzią, która faktycznie działa, jest błąd dla mojego lintera

Kod roboczy:

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

Wynik:

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

Linter myśli, że nie przestrzegam E122 z PEP-8, czy jest sposób, aby uzyskać prawidłowy ciąg i zgodny z kodem?

Sowy
źródło
1
lub po prostu powiedz swojemu pomysłowi, aby zwiększył limit znaków w linii, lub zignoruj ​​tę regułę razem
Joran Beasley
21
Nie czuję, że to dupek ... fnie ma tam mowy o strunach.
Ma0
3
@JoshLee "Brak wcięcia w kontynuacji E122 lub nieaktualna część główna". Dlaczego zamknąłeś pytanie? Nie ma duplikatów, jedyny o wieloliniowych f-stringach
Owlzy
2
@Owlzy Czy odpowiedź nie jest dokładnie taka sama: użyj nawiasów, a nie znacznika kontynuacji linii?
Nick T,
8
To pytanie nigdy nie powinno być zamknięte jako oszustwo, ponieważ połączone „oszustwo” nie jest naśladownictwem tego pytania. Zaawansowani użytkownicy Stackoverflow, o których wiesz, że mamy problem z byciem zbyt agresywnym w ten sposób, otwórz go ponownie. Oddanie ponownego głosowania jak najszybciej.
Urda,

Odpowiedzi:

98

Z przewodnika po stylu dla kodu w języku Python :

Preferowanym sposobem zawijania długich linii jest użycie domniemanej kontynuacji linii w języku Python w nawiasach, nawiasach i nawiasach klamrowych.

Biorąc to pod uwagę, poniższe rozwiązania rozwiązałyby Twój problem w sposób zgodny z PEP-8.

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

Ciągi Pythona będą automatycznie łączone, jeśli nie są oddzielone przecinkiem, więc nie musisz jawnie wywoływać join().

noddy
źródło
40

Myślę, że tak

return f'''{self.date} - {self.time},
Tags: {self.tags},
Text: {self.text}'''
Joran Beasley
źródło
teraz, gdy jest zamknięty, mogę usunąć tę odpowiedź, jeśli ludzie uważają, że powinienem ... ale nie jest to ujęte w fałszywej odpowiedzi: / \
Joran Beasley
8
ale ten rodzaj multilinii pokonuje cel ciągów f i wcięć Również nie czuję, że jest to właściwe użycie ciągów potrójnego cudzysłowu, wydaje się, że jest to hack
Owlzy
2
Chociaż ta odpowiedź odzwierciedla zamiar OP, czuję, że odpowiedź @ noddy jest lepsza. Tak się składa, że ta odpowiedź jest poprawna, ponieważ OP również chciał, aby wynik był wieloliniowy. Jeśli chcesz, aby dane wyjściowe miały inny układ niż kod źródłowy, potrójne cudzysłowy nie są właściwą drogą.
Mike Williamson
10

Możesz użyć potrójnych pojedynczych cudzysłowów lub potrójnych podwójnych cudzysłowów, ale umieść f na początku ciągu:

Potrójne pojedyncze cytaty

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

Potrójne podwójne cytaty

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

Zauważ, że nie musisz używać "\ n", ponieważ używasz łańcucha wieloliniowego.

lmiguelvargasf
źródło
8

Jak wspomniał @noddy, podejście to działa również w przypadku wyrażenia przypisania zmiennej:

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

powinien dać ci:

First var is: foo and in same line Second var is: bar
kodarrior
źródło