python - 连续多行 f 弦的样式

标签 python python-3.6

<分区>

是否有任何流行的 Python 风格指南表达了以下之间的偏好:

x = (f'One plus one is '
     f'equal to {1+1}')

和:

x = ('One plus one is '
     f'equal to {1+1}')

对于不涉及插值的行省略 f 前缀是否有意义?是否应该包括在内以保持一致性?

最佳答案

如果您查看为这两个选项中的每一个生成的字节码,您会发现这两个选项都会导致同一组操作:

>>> dis.dis("""f'One plus one is ' f'equal to {1+1}'""")
  1           0 LOAD_CONST               0 ('One plus one is equal to ')
              2 LOAD_CONST               1 (2)
              4 FORMAT_VALUE             0
              6 BUILD_STRING             2
              8 RETURN_VALUE
>>> dis.dis("""'One plus one is ' f'equal to {1+1}'""")
  1           0 LOAD_CONST               0 ('One plus one is equal to ')
              2 LOAD_CONST               1 (2)
              4 FORMAT_VALUE             0
              6 BUILD_STRING             2
              8 RETURN_VALUE

因此对于 Python,这两者做的是完全相同的事情:字符串在编译时被连接起来,整个字符串被评估为格式字符串。

请注意,根据 the PEP , f-strings 实际上是在运行时连接起来的,以确保每个格式表达式都是独立评估的:

Adjacent f-strings and regular strings are concatenated. Regular strings are concatenated at compile time, and f-strings are concatenated at run time.

这就是以下示例将生成两个 FORMAT_VALUE 操作码的原因:

>>> dis.dis("""f'{2+2}' f'{3+3}'""")
  1           0 LOAD_CONST               0 (4)
              2 FORMAT_VALUE             0
              4 LOAD_CONST               1 (6)
              6 FORMAT_VALUE             0
              8 BUILD_STRING             2
             10 RETURN_VALUE

这对实际上不包含任何格式占位符的 f 字符串没有影响。这些仍然会在编译时连接起来:

>>> dis.dis("""f'foo' f'bar'""")
  1           0 LOAD_CONST               0 ('foobar')
              2 RETURN_VALUE

因此您可以只为常量字符串包含 f 前缀,当它们不包含格式表达式时,它们最终不会被作为格式字符串处理。

因此在您的特定情况下,由于没有功能差异并且两个选项都被编译为相同的东西,因此这只是一个纯粹的样式选择,每个人都必须自己回答。

如果您正在查看现有的风格指南,很可能它们还没有涵盖 f 弦。但是,您可以使用与原始字符串相同的指南,尽管我个人不希望风格指南真正涵盖该领域。只需选择看起来最好、可读性最强以及对您最有意义的内容。毕竟,连续的字符串并不那么常见(并且您更有可能对较长的字符串使用三引号)。

关于python - 连续多行 f 弦的样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48471086/

相关文章:

python-3.x - fnmatch 不显示所有匹配的文件名

python - tensorflow 执行时间

python - 如何分割成 block (子矩阵),或处理一个巨大的矩阵,在 numpy 上给出内存错误?

python - 什么是 "ANSI_X3.4-1968"编码?

python - 用于 html 文本中链接的正则表达式

java - Baum-Welch 实现示例

python - 根据条件创建新列

pandas - 使用 boolean 检查返回数据框中的列名

python - import -force mymodule 用于 python 3.6+?

python - 如何将变量评估为 f 字符串?