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