Python 连续多行f字符串的样式

Python 连续多行f字符串的样式,python,python-3.6,Python,Python 3.6,是否有流行的Python风格指南表达了以下两者之间的偏好: x = (f'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

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

x = (f'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来说,这两者的作用完全相同:字符串在编译时被连接,整个字符串作为格式字符串进行计算

请注意,根据,f字符串实际上是在运行时连接的,以确保每个格式表达式都是独立计算的:

相邻的f字符串和常规字符串是串联的。常规字符串在编译时连接,而f字符串在运行时连接

这就是为什么下面的示例将生成两个
FORMAT\u 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字符串。但是,您可以使用与原始字符串相同的指导原则,尽管我个人不希望样式指南真正涵盖这一领域。只需选择看起来最好、可读性最好、对您最有意义的内容。毕竟,连续字符串并不是很常见(对于较长的字符串,您更可能使用三重引号)。

措辞很好。我本来打算投票以基于意见的方式结束,但后来仔细阅读了+1。@MadPhysicator好吧,我的意思是,这只是我的意见:-)(这就是为什么我把它作为评论发布的原因)。这真的不能提供一个客观的理由。对我来说,只在需要前缀的字符串上使用前缀更有意义。在每一个字符串上使用似乎有点过头了。一个相关的问题是,没有格式的f字符串是生成与文本还是f字符串相同的指令。@Turn Yep,我刚刚看过它。如果不使用前缀,Python似乎会忽略它。这不是答案,但是:我已经决定在每一行上都加上前缀。这看起来更容易,如果你以后再回来添加变量,你也不必记得添加前缀(很容易忘记)。这回答了我的另一个问题,即f字符串是否被连接+1“连续字符串并不是很常见”我发现我经常遇到它们编写错误消息。
>>> dis.dis("""f'foo' f'bar'""")
  1           0 LOAD_CONST               0 ('foobar')
              2 RETURN_VALUE