Python 改进 f-strings 语法,解除封印,整合到统一的解析器中
在将于 10 月初发布的 Python 3.12 中,我们将看到 f-strings 语法带来了一些变化,新版取消了最初制定 f-strings 时制定的一些限制。经过这些变化,使得 f-strings 更加统一,成为一种可以直接整合到解析器中的正式化语法。这将会为终端用户和库开发者带来较大优势,同时也大大降低用于解析 f-strings 代码的维护成本。
最初设置 f-strings 限制是为了能够在不修改现有词法分析器的情况下将 f-strings 的解析实现到 CPython 中。但目前来看,这些限制反而带来了复杂性。比如:
- 在表达式部分中,无法使用引号字符来界定 f-strings
>>> f'Magic wand: { bag['wand'] }' ^ SyntaxError: invalid syntax
- 之前考虑过的一种解决方法会导致在执行的代码中出现转义序列,这在 f-strings 中是被禁止的:
>>> f'Magic wand { bag[\'wand\'] } string' SyntaxError: f-string expression portion cannot include a backslash
- f-strings 中无法使用注释语法:
>>> f'''A complex trick: { ... bag['bag'] # recursive bags! ... }''' SyntaxError: f-string expression part cannot include '#'
- 许多其它语言表达式字符串插值都支持不扩展转义序列的任意嵌套。比如:
# Ruby "#{ "#{1+2}" }" # JavaScript `${`${1+2}`}` # Swift "\("\(1+2)")" # C# $"{$"{1+2}"}"
Python 团队意识到,从语言用户的角度来看,这些限制没有任何意义,所以他们目前通过赋予 f-strings 字面量一个没有例外的常规语法,并使用专用的解析代码来实现它,从而消除这些限制。
f-strings 的另一个问题是,CPython 中的当前实现依赖于将 f-strings 标记化为 STRING
令牌,并对这些令牌进行后处理。这带来了以下问题:
- 它给 CPython 解析器增加了相当大的维护成本。这是因为解析代码需要手动编写,这在历史上导致了大量的不一致性和错误。在 C 中手动编写和维护解析代码一直被认为是容易出错和危险的,因为它需要处理大量的原始词法分析器缓冲区上的手动内存管理。
- f-strings 解析代码无法使用新的 PEG 解析器所允许的新错误消息机制,这些错误消息带来的改进已经受到了热烈欢迎,但因为 f-strings 用的是独立解析器,所以无法使用上新改进的错误消息机制。另外,因为 f-strings 有几个语法特性可能会因为在表达式部分内部发生的不同隐式标记化而令人困惑(例如
f"{y:=3}"
并不是一个赋值表达式)。 - 其它 Python 实现无法知道它们是否正确实现了 f-strings,因为它们并不是官方 Python 语法的一部分。这一点很重要,因为有几个知名的替代实现正在使用 CPython 的 PEG 解析器,如 PyPy。f-strings 使用一个独立的解析器,阻止了这些替代实现利用官方语法,以及从改进的错误消息机制中受益。
期待新 f-strings 能用得更顺心。
具体情况可以查看 PEP-701:https://peps.python.org/pep-0701

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
GPT 如何将文本拆分成 token?
在GPT模型中,tokenization(词元化)指的是将用户输入的文本分割成token(词元)的过程,以让GPT能更好地理解输入文本的词义、句法和语义,以及生成更连贯的输出内容。这是非常重要的预处理操作,对模型的最终效果有重大影响。 而tokenizer(词元生成器)是将文本切分成token的工具或组件。它将原始文本转换成模型可处理的数字形式,为GPT的生成与推理提供基础能力。 本文详细介绍了GPTtokenizer的工作原理。作者Simon Willison是开源Web应用框架Django的共同发起人,他也开源了用于探索和发布数据的工具Datasette。(以下内容由OneFlow编译,转载请联系OneFlow获得授权。来源:https://simonwillison.net/2023/Jun/8/gpt-tokenizers/) 作者|Simon Willison OneFlow编译 翻译|贾川 语言大模型(如GPT-3/4、LLaMA和PaLM)使用token作为基本单位进行工作。它们接受文本作为输入,将其转换为token(整数),然后预测接下来应该出现哪些token。 通过操...
- 下一篇
新加坡国立大学计划推出多模态大模型 NExT-GPT
新加坡国立大学下一代搜索技术联合研究中心(NExT++)近日公布新计划——开发一款可以突破输入端多模态理解限制的大模型 NExT-GPT。 项目主页:https://next-gpt.github.io/ 论文地址:https://arxiv.org/pdf/2309.05519.pdf Demo:https://89bb30ddbe725cdcd7.gradio.live/ 研究者表示,他们将大语言模型与多模态适配器和不同的扩散解码器连接起来,使 NExT-GPT 能够感知不同的输入形式,并以文本、图像、视频和音频的任意组合方式生成输出内容。 NExT-GPT 架构: 通过利用现有训练有素的高性能编码器和解码器,NExT-GPT仅使用某些投影层的少量参数(1%)进行调整,这不仅有利于低成本训练,而且有利于将该模型扩展到更多潜在模态。 NExT++的研究者表示,他们的研究展示了建立一个能够模拟通用模态的人工智能代理的可能性。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2全家桶,快速入门学习开发网站教程