有没有办法在大括号内分解 f 字符串?

Wyr*_*ood 3 python python-3.x python-3.6 f-string

例如,如果我有

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

因为实际文本很少,所以在 79 个字符之前没有好地方可以换行。看来你不能这样做:

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

>>> f"{os.path.splitext(os.path.basename(
  File "<stdin>", line 1
    f"{os.path.splitext(os.path.basename(
                                        ^
SyntaxError: EOL while scanning string literal
Run Code Online (Sandbox Code Playgroud)

我唯一能做的就是拆分命令,例如:

>>> 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
'config.yaml'
Run Code Online (Sandbox Code Playgroud)

还有其他选项可以拆分 f 字符串吗?

Jim*_*ard 7

是的,您仍然可以使用三引号字符串并以您认为最好的任何方式拆分它。

从 PEP on f-strings

表达式中的前导和尾随空格被忽略

为了便于阅读,表达式中的前导和尾随空格将被忽略。这是在计算之前将表达式括在括号中的副产品。

所以之前和之后的任何空格都被删除,括号内的额外空格(例如函数调用)和方/大括号也出于同样的原因没有区别。所以这:

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

应该仍然产生预期的结果。以您认为最好的方式对其进行格式化。

尽管有人可以成功地争辩说,您可以通过其他几个步骤来减少所有内容:

# 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"
Run Code Online (Sandbox Code Playgroud)

最终选择权在您。