Python 改进 f-strings 语法,解除封印,整合到统一的解析器中
创始人
2025-07-01 10:00:28
0

在将于 10 月初发布的 Python 3.12 中,我们将看到 f-strings 语法带来了一些变化,新版取消了最初制定 f-strings 时制定的一些限制。经过这些变化,使得 f-strings 更加统一,成为一种可以直接整合到解析器中的正式化语法。这将会为终端用户和库开发者带来较大优势,同时也大大降低用于解析 f-strings 代码的维护成本。

最初设置 f-strings 限制是为了能够在不修改现有词法分析器的情况下将 f-strings 的解析实现到 CPython 中。但目前来看,这些限制反而带来了复杂性。比如:

  1. 在表达式部分中,无法使用引号字符来界定 f-strings
>>> f'Magic wand: { bag['wand'] }'
                             ^
SyntaxError: invalid syntax
  1. 之前考虑过的一种解决方法会导致在执行的代码中出现转义序列,这在 f-strings 中是被禁止的:
>>> f'Magic wand { bag[\'wand\'] } string'
SyntaxError: f-string expression portion cannot include a backslash
  1. f-strings 中无法使用注释语法:
>>> f'''A complex trick: {
... bag['bag']  # recursive bags!
... }'''
SyntaxError: f-string expression part cannot include '#'
  1. 许多其它语言表达式字符串插值都支持不扩展转义序列的任意嵌套。比如:
# Ruby
"#{ "#{1+2}" }"

# JavaScript
`${`${1+2}`}`

# Swift
"\("\(1+2)")"

# C#
$"{$"{1+2}"}"

Python 团队意识到,从语言用户的角度来看,这些限制没有任何意义,所以他们目前通过赋予 f-strings 字面量一个没有例外的常规语法,并使用专用的解析代码来实现它,从而消除这些限制。

f-strings 的另一个问题是,CPython 中的当前实现依赖于将 f-strings 标记化为 STRING 令牌,并对这些令牌进行后处理。这带来了以下问题:

  1. 它给 CPython 解析器增加了相当大的维护成本。这是因为解析代码需要手动编写,这在历史上导致了大量的不一致性和错误。在 C 中手动编写和维护解析代码一直被认为是容易出错和危险的,因为它需要处理大量的原始词法分析器缓冲区上的手动内存管理。
  2. f-strings 解析代码无法使用新的 PEG 解析器所允许的新错误消息机制,这些错误消息带来的改进已经受到了热烈欢迎,但因为 f-strings 用的是独立解析器,所以无法使用上新改进的错误消息机制。另外,因为 f-strings 有几个语法特性可能会因为在表达式部分内部发生的不同隐式标记化而令人困惑(例如 f"{y:=3}" 并不是一个赋值表达式)。
  3. 其它 Python 实现无法知道它们是否正确实现了 f-strings,因为它们并不是官方 Python 语法的一部分。这一点很重要,因为有几个知名的替代实现正在使用 CPython 的 PEG 解析器,如 PyPy。f-strings 使用一个独立的解析器,阻止了这些替代实现利用官方语法,以及从改进的错误消息机制中受益。

期待新 f-strings 能用得更顺心。

具体情况可以查看 PEP-701:https://peps.python.org/pep-0701

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...