重要
此 PEP 已被 PEP 292 取代。
抽象
本文档提出了 Python 的字符串插值功能 以允许更轻松的字符串格式设置。建议的语法更改 是引入触发特殊 以某种方式解释字符串中的“$”字符 让人想起 Unix shell 中的变量插值, awk、Perl 或 Tcl。
版权
本文档属于公有领域。
规范
字符串前面可以有一个“$”前缀,该前缀位于 前导单引号或双引号(或三引号)及之前 任何其他字符串前缀(“r”或“u”)。这样的字符串是 经过处理的插值后,正常解释 反斜杠转义的内容。处理只是发生 在将字符串推送到值堆栈之前,每次 字符串被推送。简而言之,Python 的行为与“$”完全相同 是应用于字符串的一元运算符。手术 执行如下:
从头到尾扫描字符串中的“$”字符 (在 8 位字符串或 Unicode 字符串中)。如果有 不存在“$”字符,则返回字符串原封不动。\x24\u0024
在字符串中找到的任何“$”,后跟两种 下面描述的表达式,将替换为 表达式,如在当前命名空间中计算的那样。该值为 如果包含的字符串是 8 位字符串,则转换为 如果它是 Unicode 字符串,则使用 。str()unicode()
一个 Python 标识符(可选),后跟任意数量的 拖车,其中拖车由以下部分组成: - 一个点和一个标识符, - 用方括号括起来的表达式,或 - 括在括号中的参数列表 (这正是 Python 语法中表达的模式 通过 “”,使用 中的定义。NAMEtrailer*Grammar/Grammar
用大括号括起来的任何完整的 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
讨论
选择“$”作为 字符串为了熟悉起见,因为它已经被使用了 为此,在许多其他语言和上下文中。
然后选择“$”作为前缀是很自然的,因为它是一个 插值字符的助记符。
允许拖车提供这种插值机制 甚至比大多数其他插值的功率还要大 语言,而要插值的表达式保持不变 清晰可见,没有大括号。
'$' 的工作方式类似于运算符,可以作为 运算符,但这会阻止编译时优化 并提出安全问题。因此,它只允许作为 字符串前缀。
安全问题
“$”具有评估的能力,但只能评估字面意思。如 这里描述(字符串前缀而不是运算符),它 没有引入新的安全问题,因为表达式是 评估必须从字面上存在于代码中。
实现
[1] 中的模块提供了一个 此功能的原型。它使用模块来查找 要插值的表达式的末尾,然后在每次需要值时调用表达式。在原型中, 每次对表达式进行解析和编译 评价。Itpltokenizeeval()
作为优化,可以编译插值字符串 直接输入相应的字节码;那是$'a = $a, b = $b'
可以像表达式一样编译('a = ' + str(a) + ', b = ' + str(b))
这样只需要编译一次。
原文地址:https://www.bilibili.com/read/readlist/rl812939
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。