Python 3.6中带有'f'前缀的字符串

72

我正在尝试使用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个回答

64
请查看 PEP 498 字面字符串插值

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

因此,这些表达式的计算方式就像它们出现在同一个范围内一样;局部变量、闭包和全局变量与上下文中的其他代码一样工作。

您可以在参考文档中找到更多细节:

格式化字符串字面值中的表达式会像带有括号的常规Python表达式一样处理,但有几个例外。不允许空表达式,而且lambda表达式必须用显式括号括起来。替换表达式可以包含换行符(例如三引号字符串),但不能包含注释。每个表达式都在格式化字符串字面值出现的上下文中按从左到右的顺序计算。

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

只是为了明确:3.6还没有正式发布;第一个alpha版预计将在2016年5月发布。请查看3.6版本发布时间表


1
预计f-strings会被回溯到之前的Python3版本(如果它们在新代码中得到广泛使用)吗?我无法找到任何答案,但这似乎是一个争议点。 - Chris Arena
1
没有计划将此功能回溯,PEP说明这是3.6的新功能。 - Martijn Pieters
谢谢。我试图将其与新的 Enum PEP 进行比较,但最终回溯到先前的 3.x 版本,并没有看到任何表明计划的迹象。 - Chris Arena
3
Enum功能是纯代码,可以作为可安装的附加组件向前兼容到Python的早期版本,因此旧版Python不需要发布新版本。而"f"字符串是语法,是对Python自身运行方式的更改。无法将语法作为附加组件进行向前兼容。 - Martijn Pieters
1
@JürgenA.Erhard:当然,它支持任何有效的表达式 - Martijn Pieters

15

f-strings也支持在花括号中放置任何Python表达式。

print(f"My cool string is called {name.upper()}.")

9
值得注意的是,这个PEP498已经向Python <3.6进行了回溯。
请执行以下命令安装fstring模块: 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

0

在编程中,字母f表示"格式",例如f"hello{somevar}"。在双引号和大括号{}之前加上这个小写字母f可以告诉Python 3,"嘿,这个字符串需要进行格式化。所以把这些变量放进去并格式化它。"

希望这个解释清楚了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接