Многострочная f-строка в Python

86

Я пытаюсь написать код, совместимый с PEP-8, для домашнего проекта (должен признать, что это мои первые шаги в мире Python), и у меня есть f-строка длиной более 80 символов

- сплошная тонкая линия возле точки на self.text - это отметка 80 знаков. (Извините за грустную ссылку без предварительного просмотра, но у меня должно быть 10+ представителей, чтобы опубликовать их)

Я пытаюсь разбить его на разные строки наиболее питоническим способом, но единственный ответ, который действительно работает, - это ошибка моего линтера

Рабочий код:

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

Вывод:

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

Линтер считает, что я не уважаю E122 из PEP-8, есть ли способ получить правильную строку и соответствующий код?

Owlzy
источник
1
или просто скажите своей идее увеличить лимит
Джоран Бизли
21
Я не чувствую, что это обман .. fструны там не обсуждаются.
Ma0
3
@JoshLee: «В продолжении E122 отсутствует отступ или основная строка выходит за пределы», также почему вы закрыли вопрос? Дубликатов нет, единственный о многострочных
фа
2
@Owlzy Разве ответ не тот же самый: используйте круглые скобки, а не маркер продолжения строки?
Nick T
8
Этот вопрос никогда не должен был закрываться как обман, поскольку связанный с ним «обман» не является обманом этого вопроса. StackOverflow опытных пользователей вы знаете , что у нас есть вопрос о том , слишком агрессивным , как это, получить его вновь открыли. Провести повторное голосование как можно скорее.
Урда

Ответы:

98

Из Руководства по стилю для кода Python :

Предпочтительный способ обертывания длинных строк - использование подразумеваемого продолжения строки Python внутри круглых скобок, скобок и фигурных скобок.

Учитывая это, следующее может решить вашу проблему в соответствии с требованиями PEP-8.

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

Строки Python будут автоматически объединяться, если они не разделены запятой, поэтому вам не нужно явно вызывать join().

кивать
источник
40

Я думаю было бы

return f'''{self.date} - {self.time},
Tags: {self.tags},
Text: {self.text}'''
Джоран Бизли
источник
теперь, когда он закрыт, я могу удалить этот ответ, если люди думают, что я должен ... но он не покрыт ошибочным ответом: / \
Джоран Бизли
8
но такой вид многострочных строк
лишает
2
Хотя этот ответ действительно воспроизводит намерение OP, я чувствую, что ответ @noddy лучше. Этот ответ оказался правильным, потому что OP также хотел, чтобы вывод был многострочным. Если вы хотите, чтобы формат вывода отличался от макета исходного кода, тройные кавычки не подходят.
Майк Уильямсон
10

Вы можете использовать либо тройные одинарные кавычки, либо тройные двойные кавычки, но поместите f в начале строки:

Тройные одинарные цитаты

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

Тройные двойные кавычки

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

Обратите внимание, что вам не нужно использовать «\ n», потому что вы используете многострочную строку.

lmiguelvargasf
источник
8

Как упоминалось @noddy, подход также работает для выражения присваивания переменной:

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

должен дать вам:

First var is: foo and in same line Second var is: bar
codarrior
источник