Multiline f-string in Python

Question:

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

– the solid thin line near the dot at self.text is the 80 char mark.

I’m trying to split it into different lines in the most pythonic way but the only aswer 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?

Asked By: Owlzy

||

Answers:

I think it would be

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

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().

Answered By: noddy

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
Answered By: codarrior

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.

Answered By: lmiguelvargasf

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",
      '''bletch
      is
      bletch!''')

Prints this (note the indentation):

foo is bar!
 bar is bar!
 baz is bletch!
 bletch
      is
      bletch!
Answered By: Timur Shtatland
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.