Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

PEP 215 – 字符串插值

作者:
Ka-Ping Yee <ping at zesty.ca>
状态:
已取代
类型:
标准跟踪
创建:
2000-07-24
Python 版本:
2.1
历史记录:

取代者:
292

目录

重要

此 PEP 已被 PEP 292 取代。

×

摘要

本文档建议为 Python 添加一个字符串插值功能,以实现更简单的字符串格式化。建议的语法更改是在字符串中引入一个“$”前缀,该前缀触发对字符串中“$”字符的特殊解释,类似于 Unix shell、awk、Perl 或 Tcl 中的变量插值。

规范

字符串前可以加一个“$”前缀,该前缀位于起始的单引号或双引号(或三引号)之前,以及任何其他字符串前缀(“r”或“u”)之前。在对字符串内容中的反斜杠转义字符进行正常解释之后,对这种字符串进行插值处理。每次推送字符串时,都会在字符串被推入值堆栈之前进行处理。简而言之,Python 的行为与将“$”视为应用于字符串的一元运算符完全相同。执行的操作如下:

从头到尾扫描字符串以查找“$”字符(在 8 位字符串中为 \x24,在 Unicode 字符串中为 \u0024)。如果字符串中没有“$”字符,则返回原始字符串。

字符串中任何“$”字符,后面跟着下面描述的两种表达式之一,都将被表达式在当前命名空间中求值后的值替换。如果包含的字符串是 8 位字符串,则该值将使用 str() 转换;如果它是 Unicode 字符串,则将使用 unicode() 转换。

  1. 一个可选的 Python 标识符,后面可以跟任意数量的尾随部分,其中尾随部分由以下组成: - 一个点和一个标识符, - 用方括号括起来的表达式, - 用括号括起来的参数列表(这正是 Python 语法中“NAME trailer*”所表达的模式,使用 Grammar/Grammar 中的定义。)
  2. 用花括号括起来的任何完整的 Python 表达式。

两个美元符号(“$$”)将替换为单个“$”。

示例

以下是一个交互式会话的示例,展示了此功能的预期行为。

>>> a, b = 5, 6
>>> print $'a = $a, b = $b'
a = 5, b = 6
>>> $u'uni${a}ode'
u'uni5ode'
>>> print $'\$a'
5
>>> print $r'\$a'
\5
>>> print $'$$$a.$b'
$5.6
>>> print $'a + b = ${a + b}'
a + b = 11
>>> import sys
>>> print $'References to $a: $sys.getrefcount(a)'
References to 5: 15
>>> print $"sys = $sys, sys = $sys.modules['sys']"
sys = <module 'sys' (built-in)>, sys = <module 'sys' (built-in)>
>>> print $'BDFL = $sys.copyright.split()[4].upper()'
BDFL = GUIDO

讨论

出于熟悉度的考虑,选择“$”作为字符串中的插值字符,因为它已经在许多其他语言和上下文中用于此目的。

然后,自然地选择“$”作为前缀,因为它可以 mnemonically 指代插值字符。

允许使用尾随部分可以使这种插值机制比大多数其他语言提供的插值机制更强大,同时可以清楚地显示要插值的表达式,并且不会出现花括号。

“$”的作用类似于运算符,可以实现为运算符,但这会阻止编译时优化并带来安全问题。因此,它只允许用作字符串前缀。

安全问题

“$”具有 eval 的功能,但只能 eval 字面值。如这里所述(字符串前缀而不是运算符),它不会引入新的安全问题,因为要评估的表达式必须在代码中明确存在。

实现

位于 [1]Itpl 模块提供了此功能的原型。它使用 tokenize 模块查找要插值的表达式的结尾,然后每次需要值时都对表达式调用 eval()。在原型中,每次评估表达式时都会对其进行解析和编译。

作为优化,可以将插值字符串直接编译成相应的字节码;也就是说,

$'a = $a, b = $b'

可以像编译表达式一样进行编译

('a = ' + str(a) + ', b = ' + str(b))

这样就只需要编译一次。

参考


来源:https://github.com/python/peps/blob/main/peps/pep-0215.rst

最后修改时间:2024-04-14 13:35:25 GMT