Wyrmwood Wyrmwood - 3 years ago 137
Python Question

Is there any way to break up an f-string within the braces?

For example, if I have

>>> name = f"{os.path.splitext(os.path.basename('/some/long/path/I/donot/need/to/some/config.bs'))[0]}.yaml"

Because there's very little actual text, there's no good place prior to 79 characters to break the line. It appears you cannot do this:

name = f"{os.path.splitext(os.path.basename(

>>> f"{os.path.splitext(os.path.basename(
File "<stdin>", line 1
SyntaxError: EOL while scanning string literal

The only thing I've been able to do is split up the command, like:

>>> fname = '/some/long/path/I/donot/need/to/some/config.bs'
>>> tempname = os.path.splitext(os.path.basename(
... fname))[0]
>>> name = f'{tempname}.yaml'
>>> name

Is there any other option to split the f-string?

Answer Source

Yes, you can still use triple-quotes strings and split it in any way you think is best.

From the PEP on f-strings:

Leading and trailing whitespace in expressions is ignored

For ease of readability, leading and trailing whitespace in expressions is ignored. This is a by-product of enclosing the expression in parentheses before evaluation.

So any whitespace before and after is removed, additional whitespace inside parentheses (e.g the function calls) and square/curly brackets also makes no difference for the same reason. So this:

name = f"""{

should still yield the expected result. Format it in the way you deem best.

Though one could succesfully argue that you can trim everything down with a few other steps:

# not using fully qualified name
from os.path import splitext, basename

fname = '/some/long/path/I/donot/need/to/some/config.bs'
name = f"{splitext(basename(fname))[0].yaml"

the choice is ultimately yours.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download