66

我正在尝试 Python 3.6。通过新代码,我偶然发现了这种新语法:

f"My formatting string!"

看来我们可以这样做:

>>> name = "George"
>>> print(f"My cool string is called {name}.")
My cool string is called George.

任何人都可以阐明其内部工作原理吗?特别是 f 前缀字符串可以采用的变量范围是什么?

4

4 回答 4

58

请参阅PEP 498文字字符串插值

从字符串中提取的表达式在 f 字符串出现的上下文中进行评估。这意味着表达式可以完全访问局部和全局变量。可以使用任何有效的 Python 表达式,包括函数和方法调用。

因此,表达式被评估为好像它们出现在相同的范围内;局部变量、闭包和全局变量的工作方式与相同上下文中的其他代码相同。

您将在参考文档中找到更多详细信息:

格式化字符串文字中的表达式被视为用括号括起来的常规 Python 表达式,但有一些例外。不允许使用空表达式,并且lambda表达式必须用显式括号括起来。替换表达式可以包含换行符(例如在三引号字符串中),但它们不能包含注释。每个表达式都在格式化字符串文字出现的上下文中进行评估,从左到右。

由于您正在尝试 3.6 alpha 版本,请务必阅读Python 3.6文档中的新增功能。它总结了所有更改,包括相关文档和 PEP 的链接。

需要明确的是:3.6 尚未发布;第一个 alpha 版预计要到 2016 年 5 月才会发布。请参阅3.6 发布时间表

于 2016-03-02T10:50:52.387 回答
12

f-strings 还支持花括号内的任何 Python 表达式。

print(f"My cool string is called {name.upper()}.")
于 2017-07-21T08:25:40.257 回答
7

还可能值得注意的是,此 PEP498 向后移植到 Python <3.6

pip install fstring

from fstring import fstring

x = 1

y = 2.0

plus_result = "3.0"

print fstring("{x}+{y}={plus_result}")

# Prints: 1+2.0=3.0
于 2018-04-22T06:35:25.173 回答
0

字母 f 表示“格式”,如 f"hello {somevar}。"(双引号)和 {} 字符之前的这个小 f 告诉 python 3,“嘿,这个字符串需要格式化。所以把这些变量放在在那里并格式化它。”。

希望这很清楚。

于 2018-08-25T03:40:34.080 回答