PEP 215 – 字符串插值

猫勺猫勺 05-03 15.34 W 阅读

重要

PEP 已被 PEP 292 取代。

抽象

文档提出了 Python字符串插值功能 以允许更轻松的字符串格式设置。建议的语法更改 是引入触发特殊 以某种方式解释字符串中的“$”字符 让人想起 Unix shell 中的变量插值, awk、Perl 或 Tcl。

版权

本文档属于公有领域。

规范

字符串前面可以有一个“$”前缀,该前缀位于 前导单引号或双引号(或三引号)及之前 任何其他字符串前缀(“r”或“u”)。这样的字符串是 经过处理的插值后,正常解释 反斜杠转义的内容。处理只是发生 在将字符串推送到值堆栈之前,每次 字符串被推送。简而言之,Python 的行为与“$”完全相同 是应用于字符串的一元运算符。手术 执行如下:

从头到尾扫描字符串中的“$”字符 (在 8 位字符串或 Unicode 字符串中)。如果有 不存在“$”字符,则返回字符串原封不动。\x24\u0024

在字符串中找到的任何“$”,后跟两种 下面描述的表达式,将替换为 表达式,如在当前命名空间中计算的那样。该值为 如果包含的字符串是 8 位字符串,则转换为 如果它是 Unicode 字符串,则使用 。str()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

讨论

选择“$”作为 字符串为了熟悉起见,因为它已经被使用了 为此,在许多其他语言和上下文中。

然后选择“$”作为前缀是很自然的,因为它是一个 插值字符的助记符。

允许拖车提供这种插值机制 甚至比大多数其他插值的功率还要大 语言,而要插值的表达式保持不变 清晰可见,没有大括号。

'$' 的工作方式类似于运算符,可以作为 运算符,但这会阻止编译时优化 并提出安全问题。因此,它只允许作为 字符串前缀。

安全问题

“$”具有评估的能力,但只能评估字面意思。如 这里描述(字符串前缀而不是运算符),它 没有引入新的安全问题,因为表达式是 评估必须从字面上存在于代码中。

实现

[1] 中的模块提供了一个 此功能的原型。它使用模块来查找 要插值的表达式的末尾,然后在每次需要值时调用表达式。在原型中, 每次对表达式进行解析和编译 评价。Itpltokenizeeval()

作为优化,可以编译插值字符串 直接输入相应的字节码;那是

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

可以像表达式一样编译

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

这样只需要编译一次。

The End 微信扫一扫

文章声明:以上内容(如有图片或视频在内)除非注明,否则均为腾龙猫勺儿原创文章,转载或复制请以超链接形式并注明出处。

本文作者:猫勺本文链接:https://www.jo6.cn/post/96.html

上一篇 下一篇

相关阅读

取消
微信二维码
微信二维码
支付宝二维码