Многострочная 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, есть ли способ получить правильную строку и соответствующий код?


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», потому что вы используете многострочную строку.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.