python - 在行延续中混合普通字符串和 f 字符串

标签 python python-3.x f-string

可以像这样混合普通字符串和新的 f-string 吗:

import timeit

format = """
def format(name, age):
    return (
        f'He said his name is '
        f'{name} and he is '
        f'{age} years old.'
    )
""", """
def format(name, age):
    return (
        'He said his name is '
        f'{name} and he is '
        f'{age} years old.'
    )
"""

test = """
def test():
    for name in ('Fred', 'Barney', 'Gary', 'Rock', 'Perry', 'Jackie'):
        for age in range (20, 200):
            format(name, age)
"""

for fmt in format:
    print(timeit.timeit('test()', fmt + test, number=10000))

[out]:
3.4188902939995387
3.3931472289996236

这可以使用吗,或者混合普通弦和 f 弦不被认为是最佳做法?

最佳答案

这里没有意见的问题是它是什么平均值 到“编译时连接”格式化字符串“文字”真正是运行时表达式?语言引用仅says that you can .

实验 dis表明即使是一个单独的 f 字符串也被分解为间隙字符串文字和格式化表达式(编译为新的 FORMAT_VALUE 操作码,而不是变成对 str.format 左右的调用)。每个 f 字符串都以这种方式处理 单独 (在串联之前,所以 f"{x" f"}" 是无效的)。由这种分解产生的前缀和后缀字符串文字(如果有)然后与相邻的普通字符串文字(或由相邻 f 字符串产生的字符串文字)连接。最后,同样新的 BUILD_STRING操作码用于有效地连接片段。请注意,这意味着您的两个 format函数编译为 相同 字节码和任何时间差异只是噪音。

从这个(实现者)的角度来看,规则是显而易见的;从用户的角度来看,格式化发生,直观地,只在 f"…" 内部发生。 .是否写是一个品味问题f"v={{{x},{y}}}\n""v={" f"{x},{y}" "}\n" ,但我当然可以想到后者更可取的情况。如果人们对语义有疑问,只要你愿意指出这个问题,我会说这足以使 半意见回答“是的,没关系”。

关于python - 在行延续中混合普通字符串和 f 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54823506/

相关文章:

python - OpenAI 嵌入 API 错误 : "AttributeError: module ' openai' has no attribute 'Embedding' "

python - 在 Python 中查找单词的所有变体(或时态)

python - index() 方法不接受 None 作为开始/停止

Python 3 BS4 - 返回指定 <tr> 中的第一个 <td>

c++ - 在 cython 中为 cpp 类使用访问器语法

python - 需要 F 字符串列表理解示例

python - ProactorEventLoop - 值错误 : loop argument must agree with Future

python - 使用 python/pandas 数据帧对 csv 文件进行反规范化

python - 为什么我不能在带有格式说明符的 f 字符串表达式周围使用空格?

python - 在文件中存储带有函数调用的 f 字符串