<分区>
是否有任何流行的 Python 风格指南表达了以下之间的偏好:
x = (f'One plus one is '
f'equal to {1+1}')
和:
x = ('One plus one is '
f'equal to {1+1}')
对于不涉及插值的行省略 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/