这是关于 Python 中模板字符串(Template Strings)的 PEP(Python Enhancement Proposal)750 的详细内容总结:
- 作者及讨论信息:由 Jim Baker、Guido van Rossum 等多人参与,讨论地址为Discourse thread,状态为 Accepted,类型为 Standards Track,创建于 08-Jul-2024,适用于 Python-Version 3.14,包含详细的帖子历史记录。
- 目录内容:包含 Abstract(摘要)、Relationship With Other PEPs(与其他 PEP 的关系)、Motivation(动机)、Specification(规范)、Examples(示例)、Backwards Compatibility(向后兼容性)、Security Implications(安全影响)、How To Teach This(如何教授)、Why another templating approach?(为何采用另一种模板方法)、Common Patterns Seen in Processing Templates(处理模板的常见模式)、Reference Implementation(参考实现)、Rejected Ideas(被拒绝的想法)、Acknowledgements(致谢)和 Copyright(版权)等部分。
各部分详细内容:
- Abstract:引入用于自定义字符串处理的模板字符串,是 f-strings 的推广,使用
t
前缀,求值为Template
类型,提供对字符串及其插值值的访问,可用于多种场景。 - Relationship With Other PEPs:基于 PEP 701,是 PEP 501 的更新和简化,PEP 501 曾因 f-strings 的出现而被推迟,后重新开始工作并引入
t-strings
。 - Motivation:f-strings 存在局限性,如无法拦截和转换插值值,可能导致安全漏洞,模板字符串则解决了这些问题,提供了对字符串和插值值的访问。
Specification:
- Template String Literals:引入新字符串前缀
t
,解析为Template
类型,支持 f-string 的语法,可嵌套和使用多种引号,t
和T
前缀均可,不能与u
或b
前缀组合,也不能与 f-strings 组合,但可与r
前缀组合。 - The
Template
Type:Template
是一个新的不可变类型,包含strings
(字符串部分)和interpolations
(插值部分)属性,以及values
属性、__iter__
方法等。 - The
Interpolation
Type:表示模板字符串中的表达式,是一个新的类,包含value
(求值结果)、expression
(原始文本)、conversion
(可选转换)和format_spec
(格式规范)属性。 - The
Template.values
Property:是访问interpolations
中value
属性的快捷方式。 - Iterating
Template
Contents:__iter__
方法可用于遍历模板的内容,包括字符串部分和插值部分。 - Processing Template Strings:开发者可以编写任意代码处理模板字符串,没有特定的处理方式要求。
- Template String Concatenation:支持使用
+
进行显式和隐式的模板字符串连接,但禁止Template
和str
的隐式连接。 - Template and Interpolation Equality:
Template
和Interpolation
实例通过对象身份进行比较。 - No Support for Ordering:
Template
和Interpolation
类型不支持排序。 - Support for the debug specifier (
=
):支持在模板字符串中使用=
调试规范,行为与 f-strings 类似但有细微差别。 - Raw Template Strings:支持使用
rt
(或tr
)前缀的原始模板字符串,\n
等特殊字符按原始形式处理。 - Interpolation Expression Evaluation:插值的表达式求值与 f-strings 相同,模板字符串从左到右急切求值。
- Exceptions:t-string 字面量中的异常与 f-string 字面量中的异常相同。
- No
Template.__str__()
Implementation:Template
类型没有专门的__str__
实现,而是提供有用的__repr__
实现。 - The
string.templatelib
Module:string
模块将转换为包含Template
和Interpolation
类型的templatelib
子模块。
- Template String Literals:引入新字符串前缀
- Examples:提供了多个使用模板字符串的示例,包括实现 f-strings、结构化日志记录(两种方法)和 HTML 模板等,所有示例的参考实现都在pep750-examples仓库中。
- Backwards Compatibility:使用模板字符串与以前的版本存在语法上的向后不兼容性。
- Security Implications:处理模板字符串时的安全影响与 f-strings 相似,代码应确保插值的安全处理。
- How To Teach This:模板字符串有多个受众,开发者应了解模板字符串的求值类型、与其他字符串格式化方法的关系等,框架作者可以利用模板字符串构建新工具。
- Why another templating approach?:虽然已有成熟的模板语言,但 PEP 750 旨在将模板处理逻辑融入 Python 语言,满足前端开发的需求。
- Common Patterns Seen in Processing Templates:介绍了处理模板的常见模式,如结构模式匹配、备忘录、解析为中间表示、上下文敏感处理插值、嵌套模板字符串、延迟评估、异步评估、模板重用和与格式字符串的关系等。
- Reference Implementation:CPython 实现的 PEP 750 可在[https://github.com/lysnikolao...]获取,还有相关的示例和测试仓库[https://github.com/davepeck/p...]。
- Rejected Ideas:记录了在 PEP 开发过程中被拒绝的一些想法,包括任意字符串字面量前缀、延迟评估插值、将
Template
和Interpolation
制成协议、重写__eq__
和__hash__
、额外的Decoded
类型、Template
的最终归属、完全重建原始模板字面量、禁止模板连接、任意转换值、删除Interpolation
中的conversion
、交替插值符号、Template
的交替布局、描述模板“种类”的机制和二进制模板字符串等。 - Acknowledgements:感谢 Ryan Morshead、Dropbox 的[pyxl]、Andrea Giammarchi 和 Joachim Viide 等人的贡献。
- Copyright:文档置于公共领域或 CC0-1.0-Universal 许可证下。
- Abstract:引入用于自定义字符串处理的模板字符串,是 f-strings 的推广,使用
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。