重要
此 PEP 已被 PEP 292 取代。
抽象
本文档提出了 Python 的字符串插值功能 以允许更轻松的字符串格式设置。建议的语法更改 是引入触发特殊 以某种方式解释字符串中的“$”字符 让人想起 Unix shell 中的变量插值, awk、Perl 或 Tcl。
版权
本文档属于公有领域。
规范
字符串前面可以有一个“$”前缀,该前缀位于 前导单引号或双引号(或三引号)及之前 任何其他字符串前缀(“r”或“u”)。这样的字符串是 经过处理的插值后,正常解释 反斜杠转义的内容。处理只是发生 在将字符串推送到值堆栈之前,每次 字符串被推送。简而言之,Python 的行为与“$”完全相同 是应用于字符串的一元运算符。手术 执行如下:
从头到尾扫描字符串中的“$”字符 (在 8 位字符串或 Unicode 字符串中)。如果有 不存在“$”字符,则返回字符串原封不动。\x24
\u0024
在字符串中找到的任何“$”,后跟两种 下面描述的表达式,将替换为 表达式,如在当前命名空间中计算的那样。该值为 如果包含的字符串是 8 位字符串,则转换为 如果它是 Unicode 字符串,则使用 。str()
unicode()
一个 Python 标识符(可选),后跟任意数量的 拖车,其中拖车由以下部分组成: - 一个点和一个标识符, - 用方括号括起来的表达式,或 - 括在括号中的参数列表 (这正是 Python 语法中表达的模式 通过 “”,使用 中的定义。
NAME trAIler*
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.jo6.cn/post/96.html