Multiline f-string in Python

246.3k views Asked by At

I'm trying to write PEP-8 compliant code for a domestic project and I have a line with an f-string that is more than 80 characters long:

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

I'm trying to split it into different lines in the most Pythonic way but the only answer that actually works is an error for my linter.

Working code:

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

Output:

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

The linter thinks that I'm not respecting E122 from PEP-8, is there a way to get the string right and the code compliant?

5

There are 5 answers

11
noddy On BEST ANSWER

From Style Guide for Python Code:

The preferred way of wrapping long lines is by using Python's implied line continuation inside parentheses, brackets and braces.

Given this, the following would solve your problem in a PEP-8 compliant way.

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

Python strings will automatically concatenate when not separated by a comma, so you do not need to explicitly call join().

10
Joran Beasley On

I think it would be

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

You can mix the multiline quoting styles and regular strings and f-strings:

foo = 'bar'
baz = 'bletch'
print(f'foo is {foo}!\n',
      'bar is bar!\n',
      f"baz is {baz}!\n",
      "not f-string version: baz is {baz}!\n",
      '''bletch
      is
      bletch!''')

Prints this (note the indentation):

foo is bar!
 bar is bar!
 baz is bletch!
 not f-string version: baz is {baz}!
 bletch
      is
      bletch!
0
codarrior On

As mentioned by @noddy, the approach also works for variable assignment expression:

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

should give you:

First var is: foo and in same line Second var is: bar
2
lmiguelvargasf On

You can use either triple single quotation marks or triple double quotation marks, but put an f at the beginning of the string:

Triple Single Quotes

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

Triple Double Quotes

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

Notice that you don't need to use "\n" because you are using a multiple-line string.