重要
此 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