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

Python 增強提案

PEP 460 – 新增二進位制插值和格式化

作者:
Antoine Pitrou <solipsis at pitrou.net>
狀態:
已撤回
型別:
標準跟蹤
建立日期:
2014年1月6日
Python 版本:
3.5

目錄

摘要

本 PEP 提議為 bytes 和 bytearray 物件新增最小化的格式化操作。提議的新增包括:

  • bytes % ...bytearray % ... 用於百分比格式化,語法類似於 str 物件的百分比格式化(接受單個物件、元組或字典)。
  • bytes.format(...)bytearray.format(...) 用於一種格式化,其語法類似於 str.format()(接受位置引數和關鍵字引數)。
  • bytes.format_map(...)bytearray.format_map(...) 用於一個與 str.format_map(...) 相似的 API,具有與 bytes.format()bytearray.format() 相同的格式化語法和語義。

基本原理

在 Python 2 中,str % argsstr.format(args) 允許對位元組字串進行格式化和插值。此功能通常用於組裝協議訊息,因為協議已知使用固定編碼。

Python 3 通常強制要求文字以 Unicode(即 str 物件,而不是 bytes)的形式儲存和操作。但在某些情況下,直接操作 bytes 物件是有意義的。典型用法是二進位制網路協議,您可能希望對幾個 bytes 物件(其中一些是字面量,一些是計算得出的)進行插值和組裝,以生成完整的協議訊息。例如,HTTP 或 SIP 等協議具有 ASCII 名稱的標頭以及使用可變且/或有時定義不明確的編碼的不透明“文字”值。此外,這些標頭可以跟一個二進位制主體……它可以被分塊並用 ASCII 標頭和尾部進行裝飾!

雖然有相當有效的方法可以累積二進位制資料(例如使用 bytearray 物件、bytes.join 方法,甚至 io.BytesIO),但沒有一種方法能產生像 % 格式化或 {} 格式化模板和格式化操作那樣可讀且直觀的程式碼。

二進位制格式化特性

支援的特性

在此提案中,bytesbytearray 的百分比格式化支援以下特性:

  • 透過位置和名稱查詢格式化引數(即 %s 以及 %(name)s)。
  • %s 將嘗試獲取給定值的 Py_buffer,並回退呼叫 __bytes__。生成的二進位制資料將插入到字串中的指定位置。這有望與 bytes、bytearray 和 memoryview 物件(以及其他一些物件,如 pathlib 的 path 物件)一起使用。
  • %c 將接受一個介於 0 和 255 之間的整數,並插入具有給定值的位元組。

bytesbytearray 的大括號格式化支援以下特性:

  • str.format() 支援的所有引數查詢型別(顯式位置查詢、自動增量位置查詢、關鍵字查詢、屬性查詢等)。
  • 在未指定修飾符或佈局時插入二進位制資料(例如 {}{0}{name})。這具有與百分比格式化的 %s(見上文)相同的語義。
  • ‘c’ 修飾符將接受一個介於 0 和 255 之間的整數,並插入具有給定值的位元組(與上面的 %c 相同)。

不支援的特性

str 物件的格式化中存在的所有其他特性(透過百分號運算子或 str.format() 方法)均不支援。這些特性意味著將運算子或方法的接收者視為文字,這與文字/位元組分離相悖(例如,接受 %d 作為格式程式碼將意味著位元組物件實際上是一個 ASCII 相容的文字字串)。

除了大多數特定型別的格式程式碼外,各種佈局說明符(如填充或對齊)也包含在這些不支援的特性中。此外,str 物件不能作為格式化操作的引數,即使在使用例如 %s 格式程式碼時也是如此。

__format__ 不會被呼叫。

批評

  • 開發成本和維護成本。
  • 在 3.3 版本中,編碼到 ASCII 或 latin-1 與 memcpy 一樣快(但仍然會建立一個單獨的物件)。
  • 開發人員將不得不設法繞過二進位制格式的缺失,如果他們想支援 Python 3.4 及更早版本。
  • bytes.join() 在連線位元組字串方面一直比 format 快(XXX *是這樣嗎?*)。
  • 格式化函式可以實現在第三方模組中,而不是新增到內建型別中。

其他提案

一種新的資料型別

有人提議建立一個專門用於“網路程式設計”的新資料型別。本 PEP 的作者認為這適得其反。Python 3 已經有幾個主要型別用於處理二進位制資料:bytesbytearraymemoryviewio.BytesIO

再新增一種型別會使使用者感到困惑,並且會使庫之間的互操作性更加困難(由於必要的轉換,也可能不理想)。

此外,需要的不僅僅是一種型別,而是兩種:一種不可變型別(以允許雜湊),以及一種可變型別(因為在處理網路訊息時通常需要高效的累積)。

決議

本 PEP 被 接受PEP 461 所取代,該 PEP 結合模運算子為 bytes 物件引入了更廣泛的格式化語言。

參考資料


來源:https://github.com/python/peps/blob/main/peps/pep-0460.rst

最後修改:2025-02-01 08:59:27 GMT