Python 3.4 新特性

作者:

R. David Murray <rdmurray@bitdance.com> (編輯)

本文介紹了 Python 3.4 相對於 3.3 的新特性。Python 3.4 於 2014 年 3 月 16 日釋出。有關詳細資訊,請參閱變更日誌

另請參閱

PEP 429 – Python 3.4 釋出計劃

摘要 – 版本亮點

新語法特性

  • Python 3.4 中沒有新增新的語法特性。

其他新特性

新的庫模組

顯著改進的庫模組

安全改進

CPython 實現改進

請繼續閱讀,以獲取面向使用者的更改的完整列表,包括許多其他較小的改進、CPython 最佳化、棄用和潛在的移植問題。

新功能

PEP 453:在 Python 安裝中顯式引導 PIP

預設引導 pip

新的 ensurepip 模組(在 PEP 453 中定義)提供了一個標準的跨平臺機制,用於將 pip 安裝程式引導到 Python 安裝和虛擬環境中。Python 3.4.0 中包含的 pip 版本是 pip 1.5.4,未來的 3.4.x 維護版本會將捆綁的版本更新為建立候選版本時可用的最新版本 pip

預設情況下,命令 pipXpipX.Y 將安裝在所有平臺上(其中 X.Y 代表 Python 安裝的版本),以及 pip Python 包及其依賴項。在 Windows 和所有平臺上的虛擬環境中,還將安裝未版本化的 pip 命令。在其他平臺上,系統範圍的未版本化 pip 命令通常指的是單獨安裝的 Python 2 版本。

pyvenv 命令列實用程式和 venv 模組使用 ensurepip 模組,使 pip 在虛擬環境中隨時可用。使用命令列實用程式時,預設安裝 pip,而使用 venv 模組的 API 時,必須顯式請求安裝 pip

對於 CPython POSIX 系統上的原始碼構建make installmake altinstall 命令預設引導 pip。此行為可以透過配置選項控制,並透過 Makefile 選項覆蓋。

在 Windows 和 Mac OS X 上,CPython 安裝程式現在預設安裝 pip 以及 CPython 本身(使用者可以選擇在安裝過程中不安裝它)。Windows 使用者需要選擇加入自動 PATH 修改,才能預設從命令列使用 pip,否則仍然可以透過 Windows 的 Python 啟動器作為 py -m pip 訪問。

PEP 中所述,平臺打包者可以選擇不預設安裝這些命令,只要在呼叫時,它們提供關於如何在該平臺上安裝這些命令的清晰而簡單的指導(通常使用系統包管理器)。

注意

為了避免並行 Python 2 和 Python 3 安裝之間的衝突,當直接呼叫 ensurepip 時,預設只引導版本化的 pip3pip3.4 命令 - 還需要 --default-pip 選項來請求未版本化的 pip 命令。pyvenv 和 Windows 安裝程式確保在這些環境中可以使用非限定的 pip 命令,並且始終可以透過 -m 開關而不是直接呼叫 pip,以避免在具有多個 Python 安裝的系統上出現歧義。

文件更改

作為此更改的一部分,文件的安裝 Python 模組分發 Python 模組部分已完全重新設計為簡短的入門和 FAQ 文件。大多數打包文件現在已移至 Python Packaging Authority 維護的 Python Packaging User Guide 和各個專案的文件中。

但是,由於此遷移目前仍未完成,這些指南的舊版本仍然可以作為使用 setuptools 構建 C 和 C++ 擴充套件使用 setuptools 構建 C 和 C++ 擴充套件使用。

另請參閱

PEP 453 – 在 Python 安裝中顯式引導 pip

該 PEP 由 Donald Stufft 和 Nick Coghlan 撰寫,由 Donald Stufft、Nick Coghlan、Martin von Löwis 和 Ned Deily 實現。

PEP 446:新建立的檔案描述符不可繼承

PEP 446 使新建立的檔案描述符不可繼承。一般來說,這是應用程式需要的行為:當啟動新程序時,讓當前開啟的檔案也在新程序中開啟可能會導致各種難以發現的錯誤,並可能導致安全問題。

但是,在某些情況下需要繼承。為了支援這些情況,可以使用以下新函式和方法

另請參閱

PEP 446 – 使新建立的檔案描述符不可繼承

該 PEP 由 Victor Stinner 撰寫和實現。

編解碼器處理的改進

自從首次引入以來,codecs模組一直旨在作為型別中立的動態編碼和解碼系統執行。然而,它與 Python 文字模型的緊密耦合,特別是內建的strbytesbytearray型別的型別限制便利方法,在歷史上掩蓋了這一事實。

作為澄清情況的關鍵一步,codecs.encode()codecs.decode()便利函式現在在 Python 2.7、3.3 和 3.4 中正確記錄。這些函式自 Python 2.4 以來就存在於codecs模組中(並且已包含在迴歸測試套件中),但以前只能透過執行時內省發現。

strbytesbytearray上的便利方法不同,codecs便利函式在 Python 2 和 Python 3 中都支援任意編解碼器,而不是僅限於 Unicode 文字編碼(在 Python 3 中)或basestring <-> basestring 轉換(在 Python 2 中)。

在 Python 3.4 中,直譯器能夠識別標準庫中提供的已知非文字編碼,並在適當的時候將使用者引導至這些通用便利函式

>>> b"abcdef".decode("hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs

>>> "hello".encode("rot13")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs

>>> open("foo.txt", encoding="hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs

在一個相關的更改中,只要在不破壞向後相容性的情況下可行,在編碼和解碼操作期間引發的異常都會包裝在同類型的鏈式異常中,該異常會提及導致錯誤的編解碼器的名稱

>>> import codecs

>>> codecs.decode(b"abcdefgh", "hex")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
    return (binascii.a2b_hex(input), len(input))
binascii.Error: Non-hexadecimal digit found

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)

>>> codecs.encode("hello", "bz2")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
    return (bz2.compress(input), len(input))
  File "/usr/lib/python3.4/bz2.py", line 498, in compress
    return comp.compress(data) + comp.flush()
TypeError: 'str' does not support the buffer interface

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)

最後,如以上示例所示,這些改進允許恢復在 Python 3.2 中恢復的非 Unicode 編解碼器的便利別名。這意味著現在可以將二進位制資料編碼為十六進位制表示形式(例如)並從中解碼,如下所示

>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'

標準庫中提供的二進位制和文字轉換在二進位制轉換文字轉換中詳細說明。

(由 Nick Coghlan 在 bpo-7475, bpo-17827, bpo-17828bpo-19619 中貢獻。)

PEP 451:用於匯入系統的 ModuleSpec 型別

PEP 451 提供了對匯入機制將用於載入模組的資訊(即模組規範)的封裝。這有助於簡化匯入實現和幾個與匯入相關的 API。此更改也是未來幾個與匯入相關的改進的墊腳石。

PEP 中面向公眾的更改是完全向後相容的。此外,它們對除匯入器作者之外的所有人都應該是透明的。關鍵的查詢器和載入器方法已被棄用,但它們將繼續工作。新的匯入器應使用 PEP 中描述的新方法。現有匯入器應更新以實現新方法。請參閱已棄用部分,瞭解應替換的方法及其替換方法列表。

其他語言更改

對核心 Python 語言進行的一些較小的更改是

  • Unicode 資料庫已更新為 UCD 版本 6.3。

  • min()max()現在接受一個 default 僅關鍵字引數,該引數可用於指定它們在評估的迭代器沒有元素時返回的值。(由 Julian Berman 在 bpo-18111 中貢獻。)

  • 模組物件現在是可弱引用的。

  • 模組 __file__ 屬性(和相關值)現在預設情況下應始終包含絕對路徑,唯一的例外是使用相對路徑直接執行指令碼時的 __main__.__file__。(由 Brett Cannon 在 bpo-18416 中貢獻。)

  • 除非使用 surrogatepass 錯誤處理程式,否則所有 UTF-* 編解碼器(UTF-7 除外)現在在編碼和解碼期間都拒絕代理項,但 UTF-16 解碼器除外(它接受有效的代理項對)和 UTF-16 編碼器(它在編碼非 BMP 字元時會生成它們)。(由 Victor Stinner、Kang-Hao (Kenny) Lu 和 Serhiy Storchaka 在 bpo-12892 中貢獻。)

  • 新的德語 EBCDIC 編解碼器 cp273。(由 Michael Bierenfeld 和 Andrew Kuchling 在 bpo-1097797 中貢獻。)

  • 新增烏克蘭語 編解碼器 cp1125。(由 Serhiy Storchaka 在 bpo-19668 中貢獻。)

  • bytes.join() 和 bytearray.join() 現在接受任意緩衝區物件作為引數。(由 Antoine Pitrou 在 bpo-15958 中貢獻。)

  • int 建構函式現在接受任何具有 __index__ 方法作為其 *base* 引數的物件。(由 Mark Dickinson 在 bpo-16772 中貢獻。)

  • 幀物件現在有一個 clear() 方法,用於清除幀中對區域性變數的所有引用。(由 Antoine Pitrou 在 bpo-17934 中貢獻。)

  • memoryview 現在被註冊為一個 Sequence,並支援 reversed() 內建函式。(由 Nick Coghlan 和 Claudiu Popa 在 bpo-18690bpo-19078 中貢獻。)

  • 由於 Argument Clinic 的引入以及對 inspectpydoc 模組的其他更改,help() 報告的簽名在幾種情況下得到了修改和改進。

  • __length_hint__() 現在是正式語言規範的一部分(請參閱 PEP 424)。(由 Armin Ronacher 在 bpo-16148 中貢獻。)

新模組

asyncio

新的 asyncio 模組(在 PEP 3156 中定義)為 Python 提供了一個標準的、可插拔的事件迴圈模型,在標準庫中提供了可靠的非同步 I/O 支援,並使其他事件迴圈實現更容易與標準庫和彼此之間進行互操作。

對於 Python 3.4,此模組被認為是臨時 API

另請參閱

PEP 3156 – 非同步 I/O 支援重啟:“asyncio”模組

由 Guido van Rossum 編寫和領導實現的 PEP。

ensurepip

新的 ensurepip 模組是 PEP 453 實現的主要基礎設施。在正常情況下,終端使用者不需要與此模組互動,但如果拒絕將 pip 自動引導到安裝或虛擬環境中,則可以使用它手動引導 pip

ensurepip 包括 pip 的捆綁副本,該副本與它所附帶的 CPython 版本的第一個候選版本一樣是最新的(這適用於維護版本和功能版本)。ensurepip 不會訪問網際網路。如果安裝可以訪問網際網路,則在執行 ensurepip 後,可以使用捆綁的 pippip 升級到比捆綁版本更新的版本。(請注意,這樣一個升級版本的 pip 被認為是單獨安裝的軟體包,如果解除安裝 Python,則不會被刪除。)

該模組名為 *ensure*pip,因為如果在已經安裝 pip 時呼叫它,它什麼也不做。它還有一個 --upgrade 選項,如果已安裝的 pip 版本比捆綁副本舊,則會使它安裝 pip 的捆綁副本。

enum

新的 enum 模組(在 PEP 435 中定義)提供了列舉型別的標準實現,允許其他模組(例如 socket)透過用向後相容的列舉值替換不透明的整數常量來提供更豐富的資訊性錯誤訊息和更好的除錯支援。

另請參閱

PEP 435 – 向 Python 標準庫新增列舉型別

由 Barry Warsaw、Eli Bendersky 和 Ethan Furman 編寫的 PEP,由 Ethan Furman 實現。

pathlib

新的 pathlib 模組提供表示檔案系統路徑的類,這些路徑具有適用於不同作業系統的語義。路徑類分為*純路徑*(提供純粹的計算操作,沒有 I/O)和*具體路徑*(繼承自純路徑,但也提供 I/O 操作)。

對於 Python 3.4,此模組被認為是臨時 API

另請參閱

PEP 428 – pathlib 模組 – 面向物件的檔案系統路徑

由 Antoine Pitrou 編寫和實現的 PEP。

selectors

新的 selectors 模組(作為實現 PEP 3156 的一部分而建立)允許基於 select 模組原語構建高階且高效的 I/O 多路複用。

statistics

新的 statistics 模組(在 PEP 450 中定義)直接在標準庫中提供一些核心統計功能。此模組支援計算資料序列的平均值、中位數、眾數、方差和標準差。

另請參閱

PEP 450 – 向標準庫新增統計模組

由 Steven D’Aprano 編寫和實現的 PEP

tracemalloc

新的 tracemalloc 模組(在 PEP 454 中定義)是一個用於跟蹤 Python 分配的記憶體塊的除錯工具。它提供以下資訊

  • 跟蹤物件分配的位置

  • 按檔名和行號劃分的已分配記憶體塊的統計資訊:已分配記憶體塊的總大小、數量和平均大小

  • 計算兩個快照之間的差異以檢測記憶體洩漏

另請參閱

PEP 454 – 新增新的 tracemalloc 模組以跟蹤 Python 記憶體分配

由 Victor Stinner 編寫和實現的 PEP

改進的模組

abc

可以使用新函式 abc.get_cache_token() 來知道何時使受物件圖更改影響的快取失效。(Łukasz Langa 在 bpo-16832 中貢獻了此功能。)

新類 ABCABCMeta 作為其元類。使用 ABC 作為基類與指定 metaclass=abc.ABCMeta 具有基本相同的效果,但鍵入更簡單,更易於閱讀。(Bruno Dupuis 在 bpo-16049 中貢獻了此功能。)

aifc

getparams() 方法現在返回一個 namedtuple 而不是普通元組。(Claudiu Popa 在 bpo-17818 中貢獻了此功能。)

aifc.open() 現在支援上下文管理協議:當在 with 程式碼塊中使用時,返回物件的 close() 方法將在程式碼塊結束時自動呼叫。(Serhiy Storchacha 在 bpo-16486 中貢獻了此功能。)

writeframesraw()writeframes() 方法現在接受任何 bytes-like object。(Serhiy Storchaka 在 bpo-8311 中貢獻了此功能。)

argparse

FileType 類現在接受 encodingerrors 引數,這些引數會傳遞給 open()。(Lucas Maystre 在 bpo-11175 中貢獻了此功能。)

audioop

audioop 現在支援 24 位取樣。(Serhiy Storchaka 在 bpo-12866 中貢獻了此功能。)

新的 byteswap() 函式將大端取樣轉換為小端取樣,反之亦然。(Serhiy Storchaka 在 bpo-19641 中貢獻了此功能。)

所有 audioop 函式現在都接受任何 bytes-like object。不接受字串:它們以前不起作用,現在會立即引發錯誤。(Serhiy Storchaka 在 bpo-16685 中貢獻了此功能。)

base64

base64 中的編碼和解碼函式現在接受任何 bytes-like object,而以前需要 bytesbytearray 例項。(Nick Coghlan 在 bpo-17839 中貢獻了此功能。)

新函式 a85encode()a85decode()b85encode()b85decode() 提供了將二進位制資料編碼和解碼為 Ascii85 和 git/mercurial Base85 格式的能力。 a85 函式具有可用於使其與 Ascii85 編碼的變體相容的選項,包括 Adobe 變體。(Martin Morrison、Mercurial 專案、Serhiy Storchaka 和 Antoine Pitrou 在 bpo-17618 中貢獻了此功能。)

collections

ChainMap.new_child() 方法現在接受 m 引數,該引數指定要新增到鏈的子對映。這允許將現有對映和/或自定義對映型別用於子項。(Vinay Sajip 在 bpo-16613 中貢獻了此功能。)

colorsys

RGB — YIQ 轉換的係數位數已擴充套件,以便與 FCC NTSC 版本匹配。結果的變化應小於 1%,並且可能更好地匹配其他地方找到的結果。(Brian Landers 和 Serhiy Storchaka 在 bpo-14323 中貢獻了此功能。)

contextlib

新的 contextlib.suppress 上下文管理器有助於澄清故意抑制單個語句中異常的程式碼的意圖。(Raymond Hettinger 在 bpo-15806 和 Zero Piraeus 在 bpo-19266 中貢獻了此功能。)

新的 contextlib.redirect_stdout() 上下文管理器使實用程式指令碼更容易處理將其輸出寫入 sys.stdout 並且不提供任何重定向選項的非靈活 API。使用上下文管理器,sys.stdout 輸出可以重定向到任何其他流,或者與 io.StringIO 結合使用,可以重定向到字串。後者可能特別有用,例如,從一個旨在實現命令列介面的函式捕獲輸出。建議僅用於實用程式指令碼,因為它會影響 sys.stdout 的全域性狀態。(Raymond Hettinger 在 bpo-15805 中貢獻了此功能。)

contextlib 文件也已更新,以包括對單次使用、可重用和可重入上下文管理器之間差異的 討論

dbm

dbm.open() 物件現在支援上下文管理協議。當在 with 語句中使用時,資料庫物件的 close 方法將在程式碼塊結束時自動呼叫。(Claudiu Popa 和 Nick Coghlan 在 bpo-19282 中貢獻了此功能。)

dis

函式 show_code()dis()distb()disassemble() 現在接受一個僅限關鍵字的 file 引數,該引數控制它們在何處寫入其輸出。

dis 模組現在圍繞 Instruction 類構建,該類提供對每個單獨位元組碼操作的詳細資訊的面向物件訪問。

新方法 get_instructions() 提供了一個迭代器,該迭代器為給定的 Python 程式碼段發出 Instruction 流。因此,現在可以編寫一個程式,以與 dis 模組本身提供的方式不同的方式來檢查和操作位元組碼物件。例如

>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
...     print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE

dis 模組中的各種顯示工具已被重寫以使用這些新元件。

此外,一個新的應用友好的類 Bytecode 提供了一個面向物件的 API,用於以人類可讀的形式檢查位元組碼以及迭代指令。Bytecode 建構函式接受與 get_instruction() 相同的引數(外加一個可選的 current_offset),並且可以迭代生成的物件以產生 Instruction 物件。但它也有一個 dis 方法,等價於在建構函式引數上呼叫 dis,但以多行字串的形式返回。

>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
...     print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()       
['  1           0 LOAD_FAST                0 (x)',
 '      -->     3 LOAD_CONST               1 (1)',
 '              6 BINARY_ADD',
 '              7 RETURN_VALUE']

Bytecode 還有一個類方法 from_traceback(),它提供了操作回溯的能力(也就是說,print(Bytecode.from_traceback(tb).dis()) 等價於 distb(tb))。

(由 Nick Coghlan、Ryan Kelly 和 Thomas Kluyver 在 bpo-11816 和 Claudiu Popa 在 bpo-17916 中貢獻。)

新函式 stack_effect() 計算給定操作碼和引數對 Python 堆疊的影響,這是其他方式無法獲得的資訊。(由 Larry Hastings 在 bpo-19722 中貢獻。)

doctest

一個新的 選項標誌FAIL_FAST,在檢測到第一個失敗時立即停止測試執行。(由 R. David Murray 和 Daniel Urban 在 bpo-16522 中貢獻。)

doctest 命令列介面現在使用 argparse,並有兩個新選項,-o-f-o 允許在命令列上指定 doctest 選項,而 -f-o FAIL_FAST 的簡寫(與 unittest CLI 支援的類似選項並行)。(由 R. David Murray 在 bpo-11390 中貢獻。)

doctest 現在將在擴充套件模組的 __doc__ 字串中查詢 doctest。(由 Zachary Ware 在 bpo-3158 中貢獻。)

email

as_string() 現在接受一個 policy 引數,以便在生成字串表示形式時覆蓋訊息的預設策略。這意味著現在可以在更多情況下使用 as_string,而不必為了將格式化引數傳遞給其 flatten 方法而建立和使用 generator。(由 R. David Murray 在 bpo-18600 中貢獻。)

添加了新方法 as_bytes(),以生成訊息的位元組表示形式,其方式類似於 as_string 生成字串表示形式的方式。它不接受 maxheaderlen 引數,但接受 unixfrompolicy 引數。Message__bytes__() 方法會呼叫它,這意味著 bytes(mymsg) 現在將產生直觀的結果:包含完整格式化訊息的位元組物件。(由 R. David Murray 在 bpo-18600 中貢獻。)

Message.set_param() 訊息現在接受 replace 關鍵字引數。指定後,將更新關聯的標頭,而不會更改其在標頭列表中的位置。為了向後相容,預設值為 False。(由 R. David Murray 在 bpo-18891 中貢獻。)

已新增一對新的 Message 子類(EmailMessageMIMEPart),以及一個新的子模組 contentmanager 和一個新的 policy 屬性 content_manager。所有文件當前都在新模組中,該模組是作為 email 新的 臨時 API 的一部分新增的。這些類提供了許多新方法,使從電子郵件訊息中提取內容和向其中插入內容變得更加容易。有關詳細資訊,請參閱 contentmanager 文件和 email: 示例。這些 API 新增完成了作為 email6 專案一部分計劃的大部分工作。當前臨時 API 計劃在 Python 3.5 中最終確定(可能在錯誤處理領域進行一些小的補充)。(由 R. David Murray 在 bpo-18891 中貢獻。)

filecmp

新的 clear_cache() 函式提供了清除 filecmp 比較快取的能力,該快取使用 os.stat() 資訊來確定自上次比較以來檔案是否已更改。例如,如果檔案可能已更改並在位元定檔案系統的檔案修改時間欄位的解析度更短的時間內重新檢查,則可以使用此功能。(由 Mark Levitt 在 bpo-18149 中貢獻。)

新的模組屬性 DEFAULT_IGNORES 提供了用作 dircmp() 函式的 ignore 引數預設值的目錄列表。(由 Eli Bendersky 在 bpo-15442 中貢獻。)

functools

新的 partialmethod() 描述符將部分引數應用於描述符,就像 partial() 為普通可呼叫物件提供的那樣。當包含在類定義中時,新的描述符還可以更輕鬆地使任意可呼叫物件(包括 partial() 例項)的行為類似於普通例項方法。(由 Alon Horev 和 Nick Coghlan 在 bpo-4331 中貢獻。)

新的 singledispatch() 裝飾器為 Python 標準庫帶來了對單分派泛型函式的支援。面向物件程式設計側重於將對一組公共資料的多個操作分組到一個類中,而泛型函式則側重於對操作的多種實現進行分組,使其能夠處理不同型別的資料。

另請參閱

PEP 443 – 單分派泛型函式

該 PEP 由 Łukasz Langa 編寫並實現。

total_ordering() 現在支援從底層比較函式返回 NotImplemented 的返回值。(由 Katie Miller 在 bpo-10042 中貢獻。)

現在,stdlib 中包含 partial() 函式的純 Python 版本;在 CPython 中,它被 C 加速版本覆蓋,但其他實現可以使用它。(由 Brian Thorne 在 bpo-12428 中貢獻。)

gc

新函式 get_stats() 返回一個包含自直譯器啟動以來收集統計資訊的三代字典列表。(由 Antoine Pitrou 在 bpo-16351 中貢獻。)

glob

新函式 escape() 提供了一種轉義檔名中特殊字元的方法,使其不會成為 glob 擴充套件的一部分,而是按字面匹配。(由 Serhiy Storchaka 在 bpo-8402 中貢獻。)

hashlib

新的 hashlib.pbkdf2_hmac() 函式提供了 PKCS#5 基於密碼的金鑰派生函式 2。(由 Christian Heimes 在 bpo-18582 中貢獻。)

name 屬性的 hashlib 雜湊物件現在是一個正式支援的介面。它一直存在於 CPython 的 hashlib 中(儘管它沒有為所有支援的雜湊返回小寫名稱),但它不是一個公共介面,因此其他一些 Python 實現以前不支援它。(由 Jason R. Coombs 在 bpo-18532 中貢獻。)

hmac

hmac 現在接受 bytearray 以及 bytes 作為 new() 函式的 key 引數,並且 new() 函式和 update() 方法的 msg 引數現在接受 hashlib 模組支援的任何型別。(由 Jonas Borgström 在 bpo-18240 中貢獻。)

hmac.new() 函式的 digestmod 引數現在可以是 hashlib 識別的任何雜湊摘要名稱。此外,當前將 digestmod 的值預設為 MD5 的行為已棄用:在未來的 Python 版本中將沒有預設值。(由 Christian Heimes 在 bpo-17276 中貢獻。)

隨著 block_sizename 屬性的新增(以及 digest_size 屬性的正式文件),hmac 模組現在完全符合 PEP 247 API。(由 Christian Heimes 在 bpo-18775 中貢獻。)

html

新函式 unescape() 函式將 HTML5 字元引用轉換為相應的 Unicode 字元。(由 Ezio Melotti 在 bpo-2927 中貢獻。)

HTMLParser 接受一個新的關鍵字引數 convert_charrefs,當為 True 時,會自動轉換所有字元引用。為了向後相容,其值預設為 False,但在未來的 Python 版本中會更改為 True,因此建議您顯式設定它並更新您的程式碼以使用此新功能。(由 Ezio Melotti 在 bpo-13633 中貢獻。)

HTMLParserstrict 引數現已棄用。(由 Ezio Melotti 在 bpo-15114 中貢獻。)

http

send_error() 現在接受一個可選的額外 explain 引數,該引數可用於提供擴充套件的錯誤描述,如果存在硬編碼的預設值,則會覆蓋該預設值。此擴充套件的錯誤描述將使用 error_message_format 屬性進行格式化,並作為錯誤響應的主體傳送。(由 Karl Cow 在 bpo-12921 中貢獻。)

http.server 命令列介面 現在有一個 -b/--bind 選項,該選項使伺服器偵聽特定的地址。(由 Malte Swart 在 bpo-17764 中貢獻。)

idlelib 和 IDLE

由於 idlelib 實現了 IDLE shell 和編輯器,並且不打算被其他程式匯入,因此每次釋出都會對其進行改進。請參閱 Lib/idlelib/NEWS.txt,其中包含自 3.3.0 以來的累積更改列表,以及未來 3.4.x 版本中的更改。也可以從 IDLE 幫助 ‣ 關於 IDLE 對話方塊中獲取此檔案。

importlib

InspectLoader ABC 定義了一個新方法 source_to_code(),它接受源資料和路徑,並返回程式碼物件。預設實現等效於 compile(data, path, 'exec', dont_inherit=True)。(由 Eric Snow 和 Brett Cannon 在 bpo-15627 中貢獻。)

InspectLoader 現在還具有 get_code() 方法的預設實現。但是,出於效能原因,通常需要覆蓋預設實現。(由 Brett Cannon 在 bpo-18072 中貢獻。)

作為 imp 模組棄用的一部分,reload() 函式已從 imp 移動到 importlib。(由 Berker Peksag 在 bpo-18193 中貢獻。)

importlib.util 現在有一個 MAGIC_NUMBER 屬性,用於訪問位元組碼版本號。這取代了已棄用的 imp 模組中的 get_magic() 函式。(由 Brett Cannon 在 bpo-18192 中貢獻。)

新的 importlib.util 函式 cache_from_source()source_from_cache() 取代了已棄用的 imp 模組中同名的函式。(由 Brett Cannon 在 bpo-18194 中貢獻。)

importlib 載入程式 NamespaceLoader 現在符合 InspectLoader ABC,這意味著 runpypython -m 現在可以與名稱空間包一起使用。(由 Brett Cannon 在 bpo-18058 中貢獻。)

importlib.util 有一個新函式 decode_source(),它使用通用換行符處理從位元組解碼原始碼。這對於實現 InspectLoader.get_source() 方法很有用。

importlib.machinery.ExtensionFileLoader 現在有一個 get_filename() 方法。這在最初的實現中被不小心遺漏了。(由 Eric Snow 在 bpo-19152 中貢獻。)

inspect

inspect 模組現在提供了一個基本的 命令列介面,用於快速顯示模組、類和函式的原始碼和其他資訊。(由 Claudiu Popa 和 Nick Coghlan 在 bpo-18626 中貢獻。)

unwrap() 可以輕鬆地解開由 functools.wraps() 建立的包裝函式鏈(以及任何在包裝函式上設定 __wrapped__ 屬性的其他 API)。(由 Daniel Urban、Aaron Iles 和 Nick Coghlan 在 bpo-13266 中貢獻。)

作為新的 enum 模組實現的一部分,inspect 模組現在對自定義 __dir__ 方法和透過元類提供的動態類屬性提供了更好的支援。(由 Ethan Furman 在 bpo-18929bpo-19030 中貢獻。)

getfullargspec()getargspec() 現在使用 signature() API。這使它們能夠支援更廣泛的可呼叫物件,包括那些具有 __signature__ 屬性的物件、那些具有引數診所提供的元資料的物件、functools.partial() 物件等等。請注意,與 signature() 不同,這些函式仍然忽略 __wrapped__ 屬性,並報告繫結方法的已繫結第一個引數,因此如果需要這些功能,仍然需要更新您的程式碼以直接使用 signature()。(由 Yury Selivanov 在 bpo-17481 中貢獻。)

signature() 現在支援 CPython 函式的鴨子型別,這增加了對使用 Cython 編譯的函式的支援。(由 Stefan Behnel 和 Yury Selivanov 在 bpo-17159 中貢獻。)

ipaddress

ipaddress 在 Python 3.3 中作為 臨時 API 新增到標準庫。隨著 Python 3.4 的釋出,此限定已刪除:ipaddress 現在被認為是穩定的 API,受制於維護向後相容性的正常標準庫要求。

如果地址是全域性可路由的,則新的 is_global 屬性為 True。(由 Peter Moody 在 bpo-17400 中貢獻。)

logging

TimedRotatingFileHandler 有一個新的 atTime 引數,可用於指定應發生滾動的時間。(由 Ronald Oussoren 在 bpo-9556 中貢獻。)

SocketHandlerDatagramHandler 現在支援 Unix 域套接字(透過將 port 設定為 None)。(由 Vinay Sajip 在提交 ce46195b56a9 中貢獻。)

fileConfig() 現在接受 configparser.RawConfigParser 子類例項作為 fname 引數。這有助於在日誌配置只是整個應用程式配置的一部分時使用配置檔案,或者在應用程式將配置傳遞給 fileConfig() 之前修改配置時使用配置檔案。(由 Vinay Sajip 在 bpo-16110 中貢獻。)

現在可以透過提供驗證函式作為新 verify 關鍵字引數的引數,在透過 logging.config.listen() 函式從套接字接收到的日誌配置資料進行處理之前對其進行驗證。(由 Vinay Sajip 在 bpo-15452 中貢獻。)

marshal

預設的 marshal 版本已提升到 3。實現新版本的程式碼恢復了 Python2 的行為,即僅記錄一份內部字串的副本並在反序列化時保留內部化,並將此“一份副本”的功能擴充套件到任何物件型別(包括處理遞迴引用)。這減少了 .pyc 檔案的大小以及模組從 .pyc(或 .pyo)檔案載入時在記憶體中佔用的記憶體量。(由 Kristján Valur Jónsson 在 bpo-16475 中貢獻,Antoine Pitrou 在 bpo-19219 中進行了額外的加速。)

mmap

現在,mmap 物件可以進行弱引用。(由 Valerie Lambert 在 bpo-4885 中貢獻。)

multiprocessing

在 Unix 系統上,為使用multiprocessing啟動程序,添加了兩種新的啟動方法spawnforkserver。這些方法使程序與執行緒的混合更加健壯,並且 spawn 方法與 multiprocessing 在 Windows 上一直使用的語義相匹配。新函式 get_all_start_methods() 報告平臺上可用的所有啟動方法,get_start_method() 報告當前的啟動方法,而 set_start_method() 設定啟動方法。(由 Richard Oudkerk 在 bpo-8713 中貢獻。)

multiprocessing 現在還引入了 context 的概念,它決定了子程序的建立方式。新函式 get_context() 返回一個使用指定啟動方法的上下文。它具有與 multiprocessing 模組本身相同的 API,因此你可以使用它來建立將在該上下文中執行的 Pool 和其他物件。這使得框架和應用程式或同一應用程式的不同部分可以互相不干擾地使用 multiprocessing。(由 Richard Oudkerk 在 bpo-18999 中貢獻。)

除非使用舊的 fork 啟動方法,否則子程序不再從其父程序繼承不需要的控制代碼/檔案描述符(bpo-8713 的一部分)。

現在,multiprocessing 依賴於 runpy(它實現了 -m 開關)在使用 spawnforkserver 啟動方法時,在子程序中正確地初始化 __main__。這解決了在子程序中,將 multiprocessing、-m 命令列開關和顯式相對匯入結合使用可能導致模糊故障的一些邊緣情況。(由 Nick Coghlan 在 bpo-19946 中貢獻。)

operator

新函式 length_hint() 提供瞭如何使用 __length_hint__() 特殊方法的規範實現,這是該語言功能的 PEP 424 正式規範的一部分。(由 Armin Ronacher 在 bpo-16148 中貢獻。)

現在有一個純 Python 版本的 operator 模組,可供參考和供 Python 的其他實現使用。(由 Zachary Ware 在 bpo-16694 中貢獻。)

os

有一些新函式可以獲取和設定檔案描述符(os.get_inheritable()os.set_inheritable())或 Windows 控制代碼(os.get_handle_inheritable()os.set_handle_inheritable())的可繼承標誌

新函式 cpu_count() 報告 Python 正在執行的平臺上可用的 CPU 數量(如果無法確定計數,則為 None)。現在,multiprocessing.cpu_count() 函式是根據此函式實現的。(由 Trent Nelson、Yogesh Chaudhari、Victor Stinner 和 Charles-François Natali 在 bpo-17914 中貢獻。)

os.path.samestat() 現在在 Windows 平臺上可用(並且 os.path.samefile() 實現現在在 Unix 和 Windows 之間共享)。(由 Brian Curtin 在 bpo-11939 中貢獻。)

現在,os.path.ismount() 可以識別 Windows 上驅動器根目錄下的卷。(由 Tim Golden 在 bpo-9035 中貢獻。)

os.open() 在提供它們的平臺上支援兩個新標誌,O_PATH(未開啟的檔案描述符)和 O_TMPFILE(未命名的臨時檔案;截至 3.4.0 版本,僅在 Linux 系統上可用,這些系統的核心版本為 3.11 或更新版本,並且具有 uapi 標頭)。(分別由 Christian Heimes 在 bpo-18673 和 Benjamin Peterson 貢獻。)

pdb

pdb 經過增強,可以更有效地處理生成器、yieldyield from。在除錯基於 asyncio 的程式時,這尤其有用。(由 Andrew Svetlov 和 Xavier de Gaye 在 bpo-16596 中貢獻。)

print 命令已從 pdb 中移除,恢復了從 pdb 命令列訪問 Python print() 函式的能力。Python 2 的 pdb 沒有 print 命令;相反,輸入 print 會執行 print 語句。在 Python 3 中,print 被錯誤地設定為 pdb p 命令的別名。然而,p 命令列印其引數的 repr,而不是像 Python 2 的 print 命令那樣列印 str。更糟糕的是,Python 3 的 pdb print 命令遮蔽了 Python 3 的 print 函式,使其在 pdb 提示符下不可訪問。(由 Connor Osborn 在 bpo-18764 中貢獻。)

pickle

pickle 現在支援(但預設不使用)新的 pickle 協議,協議 4。這個新協議解決了之前協議中存在的一些問題,例如巢狀類的序列化、非常大的字串和容器,以及 __new__() 方法接受僅關鍵字引數的類。它還提供了一些效率上的改進。

另請參閱

PEP 3154 – Pickle 協議 4

由 Antoine Pitrou 編寫,Alexandre Vassalotti 實現的 PEP。

plistlib

plistlib 現在有一個類似於 stdlib 序列化協議的標準模式的 API,具有新的 load()dump()loads()dumps() 函式。(較舊的 API 現在已棄用。)除了已經支援的 XML plist 格式(FMT_XML)之外,它現在還支援二進位制 plist 格式(FMT_BINARY)。(由 Ronald Oussoren 和其他人在 bpo-14455 中貢獻。)

poplib

poplib 中添加了兩個新方法:capa(),它返回 POP 伺服器通告的功能列表;以及 stls(),如果 POP 伺服器支援,它會將明文 POP3 會話切換為加密的 POP3 會話。(由 Lorenzo Catucci 在 bpo-4473 中貢獻。)

pprint

pprint 模組的 PrettyPrinter 類及其 pformat()pprint() 函式具有一個新選項 compact,用於控制輸出的格式。目前,將 compact 設定為 True 意味著序列將以每個(縮排的)行中儘可能多地容納序列元素的方式列印,直到達到 width。 (由 Serhiy Storchaka 在 bpo-19132 中貢獻。)

現在使用 Python 的標準行繼續語法來包裝長字串。(由 Antoine Pitrou 在 bpo-17150 中貢獻。)

pty

pty.spawn() 現在返回子程序的 os.waitpid() 的狀態值,而不是 None。(由 Gregory P. Smith 貢獻。)

pydoc

pydoc 模組現在直接基於 inspect.signature() 自省 API,使其能夠為更廣泛的可呼叫物件提供簽名信息。此更改還意味著在顯示幫助資訊時會考慮 __wrapped__ 屬性。(由 Larry Hastings 在 bpo-19674 中貢獻。)

pydoc 模組不再為已經繫結的方法顯示 self 引數。相反,它旨在始終顯示所提供的可呼叫物件的精確當前簽名。(由 Larry Hastings 在 bpo-20710 中貢獻。)

除了對 pydoc 進行的直接更改外,inspect 模組的底層更改也大大改進了它對自定義 __dir__ 方法和各種描述符行為的處理。

由於 help() 內建函式基於 pydoc,因此上述更改也會影響 help() 的行為。

re

新的 fullmatch() 函式和 regex.fullmatch() 方法將模式錨定到字串的兩端進行匹配。這提供了一種明確表達匹配目標的方法,從而避免了一類在程式碼更改或向現有正則表示式新增替代項時丟失 $ 字元的細微錯誤。(由 Matthew Barnett 在 bpo-16203 中貢獻。)

現在 regex 物件 的 repr 包括模式和標誌;現在 match 物件 的 repr 包括開始位置、結束位置以及匹配的字串部分。(由 Hugo Lopes Tavares 和 Serhiy Storchaka 在 bpo-13592bpo-17087 中貢獻。)

resource

新的 prlimit() 函式,在核心版本為 2.6.36 或更高版本且 glibc 為 2.13 或更高版本的 Linux 平臺上可用,提供了查詢或設定除進行呼叫的程序之外的其他程序的資源限制的能力。(由 Christian Heimes 在 bpo-16595 中貢獻。)

在 Linux 核心版本 2.6.36 或更高版本上,還有一些新的特定於 Linux 的常量:RLIMIT_MSGQUEUERLIMIT_NICERLIMIT_RTPRIORLIMIT_RTTIMERLIMIT_SIGPENDING。(由 Christian Heimes 在 bpo-19324 中貢獻。)

在 FreeBSD 9 及更高版本中,有一些新的 FreeBSD 特定常量:RLIMIT_SBSIZERLIMIT_SWAPRLIMIT_NPTS。(由 Claudiu Popa 在 bpo-19343 中貢獻。)

select

epoll 物件現在支援上下文管理協議。當在 with 語句中使用時,close() 方法將在程式碼塊結束時自動呼叫。(由 Serhiy Storchaka 在 bpo-16488 中貢獻。)

devpoll 物件現在具有 fileno()close() 方法,以及一個新屬性 closed。(由 Victor Stinner 在 bpo-18794 中貢獻。)

shelve

Shelf 例項現在可以在 with 語句中使用,並且將在 with 程式碼塊結束時自動關閉。(由 Filip Gruszczyński 在 bpo-13896 中貢獻。)

shutil

當原始檔和目標檔案是同一個檔案時,copyfile() 現在會引發一個特定的 Error 子類,即 SameFileError,這允許應用程式針對此特定錯誤採取適當的操作。(由 Atsuo Ishimoto 和 Hynek Schlawack 在 bpo-1492704 中貢獻。)

smtpd

SMTPServerSMTPChannel 類現在接受一個 *map* 關鍵字引數,如果指定,該引數將作為其 *map* 引數傳遞給 asynchat.async_chat。這允許應用程式避免影響全域性套接字對映。(由 Vinay Sajip 在 bpo-11959 中貢獻。)

smtplib

SMTPException 現在是 OSError 的子類,這允許在使用 try/except 語句的程式碼中同時捕獲套接字級別錯誤和 SMTP 協議級別錯誤,而該程式碼只關心是否發生錯誤。(由 Ned Jackson Lovely 在 bpo-2118 中貢獻。)

socket

socket 模組現在在支援的平臺上支援 CAN_BCM 協議。(由 Brian Thorne 在 bpo-15359 中貢獻。)

套接字物件具有新的方法來獲取或設定它們的 可繼承標誌get_inheritable()set_inheritable()

socket.AF_*socket.SOCK_* 常量現在是使用新的 enum 模組的列舉值。這允許在除錯期間列印有意義的名稱,而不是整數“魔術數字”。

現在,在 BSD 和 OSX 上可以使用 AF_LINK 常量。

現在 Windows 上支援 inet_pton()inet_ntop()。(由 Atsuo Ishimoto 在 bpo-7171 中貢獻。)

sqlite3

connect() 函式新增了一個布林引數 *uri*,可用於指示 *database* 引數是一個 uri(參見 SQLite URI 文件)。(由 poq 在 bpo-13773 中貢獻。)

ssl

添加了 PROTOCOL_TLSv1_1PROTOCOL_TLSv1_2(TLSv1.1 和 TLSv1.2 支援);只有在 Python 與 OpenSSL 1.0.1 或更高版本連結時,才可以使用對這些協議的支援。(由 Michele Orrù 和 Antoine Pitrou 在 bpo-16692 中貢獻。)

新函式 create_default_context() 提供了一種標準方法來獲取 SSLContext,其設定旨在在相容性和安全性之間取得合理的平衡。這些設定比 SSLContext 建構函式提供的預設設定更嚴格,並且如果最佳實踐安全性要求發生變化,則將來可能會在不事先棄用的情況下進行調整。使用支援 SSL 的 stdlib 庫的新推薦最佳實踐是使用 create_default_context() 獲取 SSLContext 物件,如果需要則修改它,然後將其作為適當的 stdlib API 的 *context* 引數傳遞。(由 Christian Heimes 在 bpo-19689 中貢獻。)

SSLContext 方法 load_verify_locations() 接受一個新的可選引數 *cadata*,該引數可用於分別透過字串或位元組直接提供 PEM 或 DER 編碼的證書。(由 Christian Heimes 在 bpo-18138 中貢獻。)

新函式 get_default_verify_paths() 返回 set_default_verify_paths() 方法用於設定 OpenSSL 的預設 cafilecapath 的路徑和環境變數的命名元組。這可以幫助除錯預設驗證問題。(由 Christian Heimes 在 bpo-18143 中貢獻。)

SSLContext 有一個新的方法 cert_store_stats(),用於報告載入的 X.509 證書、X.509 CA 證書和證書吊銷列表(crl)的數量,以及一個 get_ca_certs() 方法,該方法返回載入的 CA 證書列表。(由 Christian Heimes 在 bpo-18147 中貢獻。)

如果 OpenSSL 0.9.8 或更高版本可用,SSLContext 有一個新的屬性 verify_flags,可以透過將其設定為新的常量 VERIFY_DEFAULTVERIFY_CRL_CHECK_LEAFVERIFY_CRL_CHECK_CHAINVERIFY_X509_STRICT 的某種組合來控制證書驗證過程。預設情況下,OpenSSL 不進行任何 CRL 驗證。(由 Christien Heimes 在 bpo-8813 中貢獻。)

新的 SSLContext 方法 load_default_certs() 從預設位置載入一組預設的“證書頒發機構”(CA)證書,這些預設位置因平臺而異。它可以用來載入 TLS Web 伺服器身份驗證證書(purpose=SERVER_AUTH),供客戶端用來驗證伺服器,以及供伺服器用來驗證客戶端證書的證書(purpose=CLIENT_AUTH)。(由 Christian Heimes 在 bpo-19292 中貢獻。)

兩個新的僅限 Windows 的函式,enum_certificates()enum_crls(),提供了從 Windows 證書儲存中檢索證書、證書資訊和 CRL 的能力。(由 Christian Heimes 在 bpo-17134 中貢獻。)

使用新的 ssl.SSLContext.set_servername_callback() 方法支援伺服器端 SNI(伺服器名稱指示)。(由 Daniel Black 在 bpo-8109 中貢獻。)

SSLSocket.getpeercert() 返回的字典包含額外的 X509v3 擴充套件項:crlDistributionPointscalIssuersOCSP URI。(由 Christian Heimes 在 bpo-18379 中貢獻。)

stat

stat 模組現在由 _stat 中的 C 實現支援。需要 C 實現,因為大多數值都不是標準化的,並且是平臺相關的。(由 Christian Heimes 在 bpo-11016 中貢獻。)

該模組支援新的 ST_MODE 標誌,S_IFDOORS_IFPORTS_IFWHT。(由 Christian Hiemes 在 bpo-11016 中貢獻。)

struct

新的函式 iter_unpack 和已編譯格式上的新的 struct.Struct.iter_unpack() 方法,提供了對包含給定格式資料的重複例項的緩衝區進行流式解包的功能。(由 Antoine Pitrou 在 bpo-17804 中貢獻。)

subprocess

check_output() 現在接受一個 input 引數,該引數可用於為執行的命令提供 stdin 的內容。(由 Zack Weinberg 在 bpo-16624 中貢獻。)

getstatus()getstatusoutput() 現在可以在 Windows 上執行。此更改實際上是在 3.3.4 中無意間進行的。(由 Tim Golden 在 bpo-10197 中貢獻。)

sunau

getparams() 方法現在返回一個 namedtuple 而不是普通的 tuple。(由 Claudiu Popa 在 bpo-18901 中貢獻。)

sunau.open() 現在支援上下文管理協議:當在 with 塊中使用時,返回物件的 close 方法將在塊的末尾自動呼叫。(由 Serhiy Storchaka 在 bpo-18878 中貢獻。)

AU_write.setsampwidth() 現在支援 24 位取樣,從而增加了使用該模組寫入 24 位取樣的支援。(由 Serhiy Storchaka 在 bpo-19261 中貢獻。)

writeframesraw()writeframes() 方法現在接受任何 bytes-like object。(Serhiy Storchaka 在 bpo-8311 中貢獻了此功能。)

sys

新的函式 sys.getallocatedblocks() 返回直譯器當前分配的塊數。(在使用預設的 --with-pymalloc 設定的 CPython 中,這是透過 PyObject_Malloc() API 進行的分配。)這對於跟蹤記憶體洩漏很有用,尤其是在透過測試套件自動執行時。(由 Antoine Pitrou 在 bpo-13390 中貢獻。)

當 Python 直譯器在 互動模式 下啟動時,它會檢查 __interactivehook__ 屬性是否存在於 sys 模組上。如果該屬性存在,則在啟動互動模式之前,將呼叫其值,且不帶任何引數。檢查是在讀取 PYTHONSTARTUP 檔案之後進行的,因此可以在此處設定它。site 模組 將其設定為 一個函式,如果平臺支援 readline,則該函式啟用製表符完成和歷史記錄儲存(在 ~/.python-history 中)。如果您不想要這種(新)行為,則可以透過從 sys 中刪除此屬性(或將其設定為其他可呼叫物件),在 PYTHONSTARTUPsitecustomizeusercustomize 中覆蓋它。(由 Éric Araujo 和 Antoine Pitrou 在 bpo-5845 中貢獻。)

tarfile

現在,當直接作為指令碼或透過 -m 呼叫時,tarfile 模組支援簡單的 命令列介面。這可用於建立和提取 tar 格式的存檔檔案。(由 Berker Peksag 在 bpo-13477 中貢獻。)

textwrap

TextWrapper 類有兩個新的屬性/建構函式引數:max_lines,用於限制輸出中的行數;以及 placeholder,這是一個字串,如果由於 max_lines 而截斷輸出,它將出現在輸出的末尾。基於這些功能,一個新的便利函式 shorten() 將輸入中的所有空白壓縮為單個空格,並生成以 placeholder 結尾的給定 width 的單行(預設為 [...])。(由 Antoine Pitrou 和 Serhiy Storchaka 在 bpo-18585bpo-18725 中貢獻。)

threading

代表主執行緒的 Thread 物件可以透過新的 main_thread() 函式獲得。在正常情況下,這將是啟動 Python 直譯器的執行緒。(由 Andrew Svetlov 在 bpo-18882 中貢獻。)

traceback

新的 traceback.clear_frames() 函式接收一個 traceback 物件並清除它引用的所有幀中的區域性變數,從而減少了記憶體消耗。(由 Andrew Kuchling 在 bpo-1565525 中貢獻。)

types

新的 DynamicClassAttribute() 描述符提供了一種定義屬性的方法,該屬性在透過例項物件查詢時表現正常,但在透過類查詢時,會路由到類的 __getattr__。這允許在類上啟用屬性,並在類上具有同名的虛擬屬性(有關示例,請參閱 Enum)。(由 Ethan Furman 在 bpo-19030 中貢獻。)

urllib

現在,urllib.request 透過 DataHandler 類支援 data: URLs。(由 Mathias Panzenböck 在 bpo-16423 中貢獻。)

現在可以透過在子類上設定 method 類屬性來指定 Request 類將使用的 http 方法。(由 Jason R Coombs 在 bpo-18978 中貢獻。)

現在,Request 物件是可重用的:如果修改了 full_urldata 屬性,則所有相關的內部屬性都會更新。這意味著,例如,現在可以在多個 OpenerDirector.open() 呼叫中使用同一個 Request 物件,並使用不同的 data 引數,或者修改 Requesturl,而不是從頭開始重新計算它。還有一個新的 remove_header() 方法,可用於從 Request 中刪除標頭。(由 Alexey Kachayev 在 bpo-16464 中,Daniel Wozniak 在 bpo-17485 中,以及 Damien Brecht 和 Senthil Kumaran 在 bpo-17272 中貢獻。)

現在,HTTPError 物件有一個 headers 屬性,該屬性提供了對與錯誤關聯的 HTTP 響應標頭的訪問。(由 Berker Peksag 在 bpo-15701 中貢獻。)

unittest

TestCase 類有一個新方法 subTest(),它生成一個上下文管理器,其 with 塊將成為“子測試”。此上下文管理器允許測試方法透過例如在迴圈內呼叫 subTest 上下文管理器來動態生成子測試。因此,單個測試方法可以生成無數個單獨標識和單獨計數的測試,即使一個或多個測試失敗,所有這些測試都將執行。例如

class NumbersTest(unittest.TestCase):
    def test_even(self):
        for i in range(6):
            with self.subTest(i=i):
                self.assertEqual(i % 2, 0)

將導致六個子測試,每個子測試在 unittest 詳細輸出中以由變數名稱 i 和該變數的特定值(i=0i=1 等)組成的標籤來標識。有關此示例的完整版本,請參閱 使用子測試區分測試迭代。(由 Antoine Pitrou 在 bpo-16997 中貢獻。)

現在,unittest.main() 接受 defaultTest 的測試名稱的迭代器,而之前它只接受單個測試名稱作為字串。(由 Jyrki Pulliainen 在 bpo-15132 中貢獻。)

如果在測試發現期間(即,在測試檔案的模組級別)引發了 SkipTest,則現在將其報告為跳過而不是錯誤。(由 Zach Ware 在 bpo-16935 中貢獻。)

discover() 現在對發現的檔案進行排序,以提供一致的測試順序。(由 Martin Melin 和 Jeff Ramnani 在 bpo-16709 中貢獻。)

如果測試成功,則 TestSuite 現在會立即刪除對測試的引用。在具有垃圾回收的 Python 直譯器上,如果沒有任何其他內容保留對測試的引用,則允許垃圾回收這些測試。可以透過建立一個定義自定義 _removeTestAtIndex 方法的 TestSuite 子類來覆蓋此行為。(由 Tom Wardill、Matt McClure 和 Andrew Svetlov 在 bpo-11798 中貢獻。)

一個新的測試斷言上下文管理器 assertLogs() 將確保給定的程式碼塊使用 logging 模組發出日誌訊息。預設情況下,訊息可以來自任何記錄器,並且優先順序為 INFO 或更高,但可以指定記錄器名稱和替代的最小日誌記錄級別。可以查詢上下文管理器返回的物件,以獲取已記錄的 LogRecord 和/或格式化訊息。(由 Antoine Pitrou 在 bpo-18937 中貢獻。)

測試發現現在適用於名稱空間包(由 Claudiu Popa 在 bpo-17457 中貢獻。)

現在,unittest.mock 物件在匹配呼叫時會檢查其規範簽名,這意味著現在可以按位置或名稱而不是僅按位置來匹配引數。(由 Antoine Pitrou 在 bpo-17015 中貢獻。)

mock_open() 物件現在具有 readlinereadlines 方法。(由 Toshio Kuratomi 在 bpo-17467 中貢獻。)

venv

venv 現在包含 cshfish shell 的啟用指令碼。(由 Andrew Svetlov 在 bpo-15417 中貢獻。)

EnvBuildercreate() 便利函式接受一個新的關鍵字引數 with_pip,預設為 False,它控制 EnvBuilder 是否確保 pip 安裝在虛擬環境中。(由 Nick Coghlan 在 bpo-19552 中作為 PEP 453 實現的一部分貢獻。)

wave

getparams() 方法現在返回一個 namedtuple,而不是一個普通的元組。(由 Claudiu Popa 在 bpo-17487 中貢獻。)

wave.open() 現在支援上下文管理協議。(由 Claudiu Popa 在 bpo-17616 中貢獻。)

wave 現在可以 將輸出寫入不可查詢的檔案。(由 David Jones、Guilherme Polo 和 Serhiy Storchaka 在 bpo-5202 中貢獻。)

writeframesraw()writeframes() 方法現在接受任何 類位元組物件。(由 Serhiy Storchaka 在 bpo-8311 中貢獻。)

weakref

新的 WeakMethod 類模擬對繫結方法的弱引用。(由 Antoine Pitrou 在 bpo-14631 中貢獻。)

新的 finalize 類可以註冊一個回撥,以便在物件被垃圾回收時呼叫,而無需仔細管理弱引用本身的生命週期。(由 Richard Oudkerk 在 bpo-15528 中貢獻。)

ref 關聯的回撥(如果有)現在透過 __callback__ 屬性公開。(由 Mark Dickinson 在 bpo-17643 中貢獻。)

xml.etree

一個新的解析器 XMLPullParser 允許非阻塞應用程式解析 XML 文件。可以在 用於非阻塞解析的 Pull API 中看到示例。(由 Antoine Pitrou 在 bpo-17741 中貢獻。)

xml.etree.ElementTreetostring()tostringlist() 函式,以及 ElementTreewrite() 方法,現在有一個 short_empty_elements 僅限關鍵字引數,用於控制是否以縮寫形式 (<tag />) 或展開形式 (<tag></tag>) 寫入沒有內容的元素。(由 Ariel Poliak 和 Serhiy Storchaka 在 bpo-14377 中貢獻。)

zipfile

writepy() 方法 PyZipFile 類有一個新的 filterfunc 選項,可以用來控制哪些目錄和檔案被新增到存檔中。例如,這可以用來排除存檔中的測試檔案。(由 Christian Tismer 在 bpo-19274 中貢獻。)

現在,ZipFilePyZipfileallowZip64 引數預設為 True。(由 William Mallard 在 bpo-17201 中貢獻。)

CPython 實現更改

PEP 445:自定義 CPython 記憶體分配器

PEP 445 添加了新的 C 級介面,用於自定義 CPython 直譯器中的記憶體分配。

另請參閱

PEP 445 – 新增新的 API 以自定義 Python 記憶體分配器

該 PEP 由 Victor Stinner 撰寫和實現。

PEP 442:安全物件終結

PEP 442 消除了 CPython 中物件終結的當前限制和怪癖。有了它,具有 __del__() 方法的物件以及具有 finally 子句的生成器可以在它們是引用迴圈的一部分時被終結。

作為此更改的一部分,在大多數情況下,模組全域性變數不再在直譯器關閉期間被強制設定為 None,而是依賴於迴圈垃圾收集器的正常執行。這避免了一整類直譯器關閉時錯誤,通常涉及 __del__ 方法,這些錯誤自引入迴圈 GC 以來就一直困擾著 Python。

另請參閱

PEP 442 – 安全物件終結

由 Antoine Pitrou 編寫和實現的 PEP。

PEP 456:安全且可互換的雜湊演算法

PEP 456 跟進了之前在 Python 雜湊演算法上完成的安全修復工作,以解決某些面向公眾的 API(受字典查詢支援)可能受到的 DOS 攻擊。(請參閱 bpo-14621 瞭解當前一輪改進的開始。)PEP 統一了 CPython 的雜湊程式碼,以便封裝器更容易替換不同的雜湊演算法,並將 Python 的預設實現切換為具有 64 位資料型別的平臺上的 SipHash 實現。與舊的 FNV 演算法相比,任何效能差異都是微不足道的。

PEP 將額外的欄位新增到 sys.hash_info named tuple 中,以描述當前正在執行的二進位制檔案使用的雜湊演算法。否則,PEP 不會更改任何現有的 CPython API。

PEP 436:引數診所

“引數診所”(PEP 436)現在是 CPython 構建過程的一部分,可以用來簡化定義和維護以 C 實現的內建函式和標準庫擴充套件模組的準確簽名的過程。

一些標準庫擴充套件模組已轉換為在 Python 3.4 中使用引數診所,並且 pydocinspect 已相應更新。

預計用於程式內省的簽名元資料將作為 Python 3.4 維護版本的一部分新增到 C 中實現的額外可呼叫物件中。

注意

引數診所 PEP 與實現的當前狀態不完全同步。在這種情況下,釋出經理和核心開發團隊認為這是可以接受的,因為引數診所不會在 Python 3.4 中作為公共 API 提供給第三方使用。

另請參閱

PEP 436 – 引數診所 DSL

由 Larry Hastings 編寫和實現的 PEP。

其他構建和 C API 更改

  • 新的 PyType_GetSlot() 函式已新增到穩定的 ABI 中,允許在使用有限 API 時從命名型別槽檢索函式指標。(由 Martin von Löwis 在 bpo-17162 中貢獻。)

  • 新的 Py_SetStandardStreamEncoding() 預初始化 API 允許嵌入 CPython 直譯器的應用程式可靠地強制標準流使用特定的編碼和錯誤處理程式。(由 Bastien Montagne 和 Nick Coghlan 在 bpo-16129 中貢獻。)

  • 大多數不改變字串引數的 Python C API 現在都正確地標記為接受 const char * 而不是 char *。(由 Serhiy Storchaka 在 bpo-1772673 中貢獻。)

  • 即使在沒有 Python 直譯器可用時(例如,在交叉編譯場景中),也可以使用新的 shell 版本的 python-config

  • PyUnicode_FromFormat() 現在支援 %s%A%U%V%S%R 的寬度和精度規範。(由 Ysj Ray 和 Victor Stinner 在 bpo-7330 中貢獻。)

  • 新函式 PyStructSequence_InitType2() 補充了現有的 PyStructSequence_InitType() 函式。不同之處在於,它在成功時返回 0,失敗時返回 -1

  • 現在可以使用 GCC 和 clang 的最新版本的地址健全性檢查功能編譯 CPython 原始碼:小型物件分配器中的誤報已被消除。(由 Dhiru Kholia 在 bpo-18596 中貢獻。)

  • Windows 構建現在使用地址空間佈局隨機化資料執行保護。(由 Christian Heimes 在 bpo-16632 中貢獻。)

  • 新函式 PyObject_LengthHint()operator.length_hint() 的 C API 等效項。(由 Armin Ronacher 在 bpo-16148 中貢獻。)

其他改進

  • python 命令有一個新的 選項 -I,這將使其在 “隔離模式” 下執行,這意味著 sys.path 既不包含指令碼的目錄,也不包含使用者的 site-packages 目錄,並且所有 PYTHON* 環境變數都被忽略(它同時暗示 -s-E)。未來可能還會應用其他限制,其目標是將指令碼的執行與使用者的環境隔離。例如,當 Python 用於執行系統指令碼時,這是合適的。在大多數 POSIX 系統上,它可以在並且應該在系統指令碼的 #! 行中使用。(由 Christian Heimes 在 bpo-16499 中貢獻。)

  • 在支援 readline 的系統上,互動式直譯器現在預設啟用 Tab 補全。歷史記錄也預設啟用,並寫入(以及從中讀取)檔案 ~/.python-history。(由 Antoine Pitrou 和 Éric Araujo 在 bpo-5845 中貢獻。)

  • 使用 --version 呼叫 Python 直譯器現在將版本輸出到標準輸出而不是標準錯誤 (bpo-18338)。對 argparse (bpo-18920) 和其他具有類似指令碼呼叫功能的模組 (bpo-18922) 進行了類似的更改。

  • CPython Windows 安裝程式現在在註冊副檔名時將 .py 新增到 PATHEXT 變數,允許使用者透過僅鍵入其名稱而不帶 .py 副檔名在 Windows 命令提示符下執行 Python 指令碼。(由 Paul Moore 在 bpo-18569 中貢獻。)

  • 新的 make 目標 coverage-report 將構建 Python,執行測試套件,並使用 gcovlcov 為 C 程式碼庫生成 HTML 覆蓋率報告。

  • 現在,Python 迴歸測試套件-R 選項還會使用 sys.getallocatedblocks() 檢查記憶體分配洩漏。(由 Antoine Pitrou 在 bpo-13390 中貢獻。)

  • python -m 現在可以與名稱空間包一起使用。

  • stat 模組現在用 C 實現,這意味著它從 C 標頭檔案獲取其常量的值,而不是像以前那樣將這些值硬編碼在 Python 模組中。

  • 現在可以正確載入來自單個作業系統模組(.so.dll)的多個 Python 模組(以前它會默默地返回檔案中的第一個 Python 模組)。(由 Václav Šmilauer 在 bpo-16421 中貢獻。)

  • 添加了一個新的操作碼 LOAD_CLASSDEREF,以修復類主體中載入自由變數的錯誤,該錯誤可能會被某些 __prepare__ 的用法觸發。(由 Benjamin Peterson 在 bpo-17853 中貢獻。)

  • Victor Stinner 使用他基於 PEP 445pyfailmalloc 工具識別並修復了許多與 MemoryError 相關的崩潰 (bpo-18408, bpo-18520)。

  • pyvenv 命令現在接受一個 --copies 選項,即使在預設使用符號連結的系統上,也可以使用副本而不是符號連結。(由 Vinay Sajip 在 bpo-18807 中貢獻。)

  • pyvenv 命令還接受一個 --without-pip 選項,以抑制否則會自動將 pip 引導到虛擬環境中。(由 Nick Coghlan 在 bpo-19552 中貢獻,作為 PEP 453 實現的一部分。)

  • 現在,PYTHONIOENCODING 環境變數的值集中編碼名稱是可選的。這使得可以僅設定錯誤處理程式,而無需更改預設編碼。(由 Serhiy Storchaka 在 bpo-18818 中貢獻。)

  • bz2lzmagzip 模組的 open 函式現在支援 x(獨佔建立)模式。(由 Tim Heaney 和 Vajrasky Kok 在 bpo-19201bpo-19222bpo-19223 中貢獻。)

重大最佳化

  • UTF-32 解碼器現在快了 3 到 4 倍。(由 Serhiy Storchaka 在 bpo-14625 中貢獻。)

  • 現在減少了集合的雜湊衝突成本。每個雜湊表探測現在會檢查一系列連續的相鄰鍵/雜湊對,然後再繼續在雜湊表中進行隨機探測。這利用了快取區域性性,使衝突解決的成本更低。衝突解決方法可以描述為線性探測和開放定址的混合體。其他線性探測的數量預設為 9。可以透過在編譯時將 LINEAR_PROBES 定義為任何值來更改此值。設定 LINEAR_PROBES=0 以完全關閉線性探測。(由 Raymond Hettinger 在 bpo-18771 中貢獻。)

  • 直譯器啟動速度提高了約 30%。速度提升歸因於幾個措施。直譯器在啟動時載入的模組減少了,例如 recollectionslocale 模組及其依賴項不再預設匯入。marshal 模組已得到改進,可以更快地載入已編譯的 Python 程式碼。(由 Antoine Pitrou、Christian Heimes 和 Victor Stinner 在 bpo-19219bpo-19218bpo-19209bpo-19205bpo-9548 中貢獻。)

  • bz2.BZ2File 在大多數情況下現在與 Python2 版本一樣快或更快。lzma.LZMAFile 也進行了最佳化。(由 Serhiy Storchaka 和 Nadeem Vawda 在 bpo-16034 中貢獻。)

  • 對於小整數(最常見的用例),random.getrandbits() 的速度提高了 20%-40%。(由 Serhiy Storchaka 在 bpo-16674 中貢獻。)

  • 透過利用新的字串儲存格式,字串的 pickle 操作現在明顯更快。(由 Victor Stinner 和 Antoine Pitrou 在 bpo-15596 中貢獻。)

  • io.FileIO.readall() 中的效能問題已解決。這尤其影響 Windows,並顯著加快了透過 subprocess 管道傳輸大量資料的情況。(由 Richard Oudkerk 在 bpo-15758 中貢獻。)

  • html.escape() 現在快了 10 倍。(由 Matt Bryant 在 bpo-18020 中貢獻。)

  • 在 Windows 上,現在在 obmalloc 中使用原生 VirtualAlloc,而不是 CRT malloc。人工基準測試顯示記憶體節省約 3%。

  • os.urandom() 現在使用延遲開啟的永續性檔案描述符,以避免在多個執行緒並行執行時使用大量檔案描述符。(由 Antoine Pitrou 在 bpo-18756 中貢獻。)

已棄用

本節介紹了 Python 3.4 中已棄用並在 Python 3.5 或更高版本中移除的各種 API 和其他功能。在大多數(但並非所有)情況下,使用已棄用的 API 會在啟用棄用警告時(例如,透過使用 -Wd)執行直譯器時產生 DeprecationWarning

Python API 中的棄用

  • 正如在 PEP 451:匯入系統的 ModuleSpec 型別 中提到的,許多 importlib 方法和函式已被棄用:importlib.find_loader()importlib.util.find_spec() 取代;importlib.machinery.PathFinder.find_module()importlib.machinery.PathFinder.find_spec() 取代;importlib.abc.MetaPathFinder.find_module()importlib.abc.MetaPathFinder.find_spec() 取代;importlib.abc.PathEntryFinder.find_loader()find_module()importlib.abc.PathEntryFinder.find_spec() 取代;所有 xxxLoader ABC load_module 方法(importlib.abc.Loader.load_module()importlib.abc.InspectLoader.load_module()importlib.abc.FileLoader.load_module()importlib.abc.SourceLoader.load_module())不再應該被實現,而是載入器應該實現一個 exec_module 方法(importlib.abc.Loader.exec_module()importlib.abc.InspectLoader.exec_module()importlib.abc.SourceLoader.exec_module())並讓匯入系統處理其餘部分;並且 importlib.abc.Loader.module_repr()importlib.util.module_for_loader()importlib.util.set_loader()importlib.util.set_package() 不再需要,因為它們的功能現在由匯入系統自動處理。

  • imp 模組即將被棄用。為了保持與 Python 2/3 程式碼庫的相容性,該模組的移除目前未計劃。

  • formatter 模組即將被棄用,並計劃在 Python 3.6 中刪除。

  • MD5 作為 hmac.new() 函式的預設 digestmod 已被棄用。Python 3.6 將需要一個顯式的摘要名稱或建構函式作為 digestmod 引數。

  • ftplib 模組中的內部 Netrc 類在其文件字串中已被記錄為棄用相當長的時間。它現在會發出 DeprecationWarning,並將在 Python 3.5 中完全刪除。

  • subprocess.Popen.wait() 的未記錄的 endtime 引數不應該被公開,並且希望沒有被使用;它已被棄用,並且很可能會在 Python 3.5 中刪除。

  • HTMLParserstrict 引數已被棄用。

  • plistlibreadPlist()writePlist()readPlistFromBytes()writePlistToBytes() 函式已被棄用,取而代之的是相應的新函式 load()dump()loads()dumps()Data() 已被棄用,取而代之的是直接使用 bytes 建構函式。

  • sysconfigSO 已被棄用,它已被 EXT_SUFFIX 取代。

  • 各種 open 函式接受的 U 模式已被棄用。在 Python3 中,它沒有任何實際用途,應替換為適當使用 io.TextIOWrapper(如果需要)及其 newline 引數。

  • 已棄用 xml.etree.ElementTree.iterparse()parser 引數,以及 XMLParser()html 引數。為了準備移除後者,所有傳遞給 XMLParser 的引數都應透過關鍵字傳遞。

已棄用的特性

  • 使用 -n 標誌(無子程序)執行 IDLE 已被棄用。但是,該功能將不會被移除,直到 bpo-18823 得到解決。

  • 如果存在,site 模組將“site-python”目錄新增到 sys.path 中已棄用(bpo-19375)。

已移除

不再支援的作業系統

以下作業系統的支援已從原始碼和構建工具中移除

  • OS/2 (bpo-16135)。

  • Windows 2000 (更改集 e52df05b496a)。

  • COMSPEC 指向 command.com 的 Windows 系統 (bpo-14470)。

  • VMS (bpo-16136)。

API 和功能移除

以下過時和之前已棄用的 API 和功能已被移除

  • 未維護的 Misc/TextMateMisc/vim 目錄已被移除(有關替代方案的建議,請參閱 devguide)。

  • SO makefile 宏已移除(它已被 SHLIB_SUFFIXEXT_SUFFIX 宏取代)(bpo-16754)。

  • PyThreadState.tick_counter 欄位已被移除;自從 Python 3.2 引入“新 GIL”以來,它的值已無意義 (bpo-19199)。

  • PyLoaderPyPycLoader 已從 importlib 中移除。(由 Taras Lyapun 在 bpo-15641 中貢獻。)

  • HTTPConnectionHTTPSConnectionstrict 引數已被移除。不再支援 HTTP 0.9 風格的“簡單響應”。

  • 已棄用的 urllib.request.Request getter 和 setter 方法 add_datahas_dataget_dataget_typeget_hostget_selectorset_proxyget_origin_req_hostis_unverifiable 已被移除(請使用直接屬性訪問代替)。

  • 已移除從 marshal 載入已棄用的 TYPE_INT64 的支援。(由 Dan Riti 在 bpo-15480 中貢獻。)

  • inspect.Signature:現在要求僅位置引數具有有效的名稱。

  • object.__format__() 不再接受非空格式字串,現在會引發 TypeError。自 Python 3.2 以來,使用非空字串已被棄用。進行此更改是為了防止在物件獲得 __format__ 方法時,先前工作(但不正確)的程式碼開始失敗的情況,這意味著如果使用不具有處理它的 __format__ 方法的物件使用 's' 格式程式碼,則程式碼現在可能會引發 TypeError。有關背景資訊,請參閱 bpo-7994

  • difflib.SequenceMatcher.isbjunk()difflib.SequenceMatcher.isbpopular() 在 3.2 中已棄用,現在已被移除:請使用 x in sm.bjunkx in sm.bpopular,其中 smSequenceMatcher 物件 (bpo-13248)。

程式碼清理

  • 未使用的且未文件化的內部 Scanner 類已從 pydoc 模組中移除。

  • 私有的且實際上未使用的 _gestalt 模組已移除,以及私有的 platform 函式 _mac_ver_lookup_mac_ver_gstalt_bcd2str,它們只會曾在嚴重損壞的 OSX 系統上被呼叫(請參閱 bpo-18393)。

  • 已移除包含在 tarfile 模組名稱空間中的某些 stat 常量的硬編碼副本。

移植到 Python 3.4

本節列出了之前描述的更改和其他可能需要更改程式碼的錯誤修復。

“python”命令列為的更改

  • 在 posix shell 中,將 PATH 環境變數設定為空值等效於根本不設定它。但是,將 PYTHONPATH 設定為空值等效於根本不設定它:將 PYTHONPATH 設定為空值等效於將其設定為 .,這在類比 PATH 的工作方式時會導致混淆。該行為現在符合 PATH 的 posix 約定。

  • 預設情況下,現在關閉 CPython 直譯器的除錯 (--with-pydebug) 構建的 [X refs, Y blocks] 輸出。可以使用 -X showrefcount 選項重新啟用它。(由 Ezio Melotti 在 bpo-17323 中貢獻。)

  • python 命令和大多數 stdlib 指令碼(以及 argparse)現在將 --version 資訊輸出到 stdout 而不是 stderr (有關問題列表,請參見上面的 其他改進)。

Python API 的更改

  • importlib.abc 中定義的 ABC 現在會引發適當的異常或返回預設值,而不是盲目地引發 NotImplementedError。這隻會影響呼叫 super() 並一直傳遞到 ABC 的程式碼。為了相容性,請根據需要捕獲 NotImplementedError 或適當的異常。

  • 模組型別現在預設將 __package____loader__ 屬性初始化為 None。要確定這些屬性是否以向後相容的方式設定,請使用例如 getattr(module, '__loader__', None) is not None。(bpo-17115。)

  • importlib.util.module_for_loader() 現在無條件地設定 __loader____package__ 以正確支援重新載入。如果不需要這樣做,則需要手動設定這些屬性。您可以使用 importlib.util.module_to_load() 進行模組管理。

  • 匯入現在在重新載入時無條件地重置相關屬性(例如,__name____loader____package____file____cached__)。請注意,這恢復了 3.3 之前的行為,這意味著在重新載入時會重新找到模組(bpo-19413)。

  • 凍結包不再將 __path__ 設定為包含包名稱的列表,而是將其設定為空列表。如果存在與凍結包名稱相同的目錄,則之前的行為可能會導致匯入系統在子模組匯入上執行錯誤的操作。確定模組是否是包的正確方法是使用 hasattr(module, '__path__')bpo-18065)。

  • 凍結模組不再定義 __file__ 屬性。對於凍結模組來說,設定該屬性在語義上是不正確的,因為它們不是從任何顯式位置載入的。如果您必須知道模組來自凍結程式碼,則可以檢視模組的 __spec__.location 是否設定為 'frozen',檢查載入器是否是 importlib.machinery.FrozenImporter 的子類,或者如果需要 Python 2 相容性,則可以使用 imp.is_frozen()

  • 如果 py_compile.compile() 要寫入的檔案路徑是符號連結或非普通檔案,則現在會引發 FileExistsError。這是為了發出警告,即匯入會將這些檔案覆蓋為普通檔案,而不管它們最初的檔案路徑型別是什麼。

  • 當載入的原始碼觸發 SyntaxErrorUnicodeDecodeError 時,importlib.abc.SourceLoader.get_source() 不再引發 ImportError。因為 ImportError 僅在找不到原始碼時才引發,但應該找到,因此當找到原始碼但結構不正確時,感覺它是對該含義的過度使用/過載。如果您之前捕獲了 ImportError,並且希望繼續忽略語法或解碼問題,請現在捕獲所有三個異常。

  • functools.update_wrapper()functools.wraps() 現在正確地將 __wrapped__ 屬性設定為被包裝的函式,即使該函式也設定了其 __wrapped__ 屬性。這意味著 __wrapped__ 屬性現在正確地連結了一堆裝飾函式,而不是鏈中的每個 __wrapped__ 屬性都引用最內部的函式。假設之前的行為是有意為之的內省庫可以使用 inspect.unwrap() 來訪問鏈中沒有 __wrapped__ 屬性的第一個函式。

  • inspect.getfullargspec() 已在 inspect.signature() 之上重新實現,因此比過去處理更廣泛的可呼叫物件。預計在 Python 3.4 系列的整個過程中,其他內建和擴充套件模組可呼叫物件將獲得簽名元資料。假設 inspect.getfullargspec() 將在非 Python 可呼叫物件上失敗的程式碼可能需要進行相應的調整。

  • importlib.machinery.PathFinder 現在將當前工作目錄傳遞給 sys.path_hooks 中的空字串物件。這導致 sys.path_importer_cache 永遠不包含 '',因此基於 sys.path 迭代 sys.path_importer_cache 不會找到所有鍵。在當前工作目錄中匯入時,模組的 __file__ 現在也將具有絕對路徑,包括在使用 -m 和直譯器時(除了當使用相對路徑直接執行指令碼時,__main__.__file__ 除外)(Brett Cannon 在 bpo-18416 中貢獻)。在命令列中指定)(bpo-18416)。

  • 移除 HTTPConnectionHTTPSConnectionstrict 引數,如果你是按位置而不是按關鍵字指定剩餘的引數,則會改變這些引數的含義。如果你一直關注棄用警告,你的程式碼應該已經透過關鍵字指定任何額外的引數。

  • 現在,from __future__ import ... 語句之間的字串總是會引發 SyntaxError。 以前,如果沒有前導文件字串,則有時會忽略中間的字串。 這使 CPython 符合語言規範;Jython 和 PyPy 已經符合。(bpo-17434)。

  • ssl.SSLSocket.getpeercert()ssl.SSLSocket.do_handshake() 現在當 SSLSocket 未連線時,會引發帶有 ENOTCONNOSError,而不是之前的引發 AttributeError 的行為。此外,如果尚未完成握手,getpeercert() 將引發 ValueError

  • 現在,當輸入字串包含非 b32 字母表字元時,base64.b32decode() 會引發 binascii.Error,而不是 TypeError。當其他 TypeError 被轉換時,這個特定的 TypeError 被遺漏了。(由 Serhiy Storchaka 在 bpo-18011 中貢獻。)注意:此更改也無意中應用於 Python 3.3.3。

  • 現在,當建立 cgi.FieldStorage 例項被垃圾回收時,file 屬性會自動關閉。 如果你將檔案物件從 cgi.FieldStorage 例項中單獨提取出來,並且沒有保持例項處於活動狀態,那麼你應該儲存整個 cgi.FieldStorage 例項,或者在 cgi.FieldStorage 例項被垃圾回收之前讀取檔案的內容。

  • 現在,對已關閉的 SSL 套接字呼叫 readwrite 會引發資訊豐富的 ValueError,而不是先前更神秘的 AttributeErrorbpo-9177)。

  • slice.indices() 不再為巨大的值產生 OverflowError。 作為此修復的結果,如果給定負長度,slice.indices() 現在會引發 ValueError;之前它會返回無意義的值(bpo-14794)。

  • cmath 函式不同,complex 建構函式錯誤地接受了 float 值,如果物件的 __complex__ 特殊方法返回一個值。 現在,這會引發 TypeError。(bpo-16290。)

  • 3.2 和 3.3 中的 int 建構函式錯誤地接受了 base 引數的 float 值。 很少有人會這樣做,但如果有人這樣做,現在會引發 TypeErrorbpo-16772)。

  • 現在,關鍵字專用引數的預設值是在常規關鍵字引數的預設值之後求值的,而不是之前。 希望沒有人編寫任何依賴於以前錯誤行為的程式碼(bpo-16967)。

  • 現在,在 fork() 之後,會清除過時的執行緒狀態。 這可能會釋放一些以前被錯誤地永久保留的系統資源(例如,儲存線上程本地儲存中的資料庫連線)。(bpo-17094。)

  • 現在,__annotations__ 字典中的引數名稱會像 __kwdefaults__ 一樣被正確地混淆。(由 Yury Selivanov 在 bpo-20625 中貢獻。)

  • 現在,hashlib.hash.name 始終以小寫形式返回識別符號。 以前,某些內建雜湊具有大寫名稱,但是既然它是一個正式的公共介面,則命名已保持一致(bpo-18532)。

  • 由於 unittest.TestSuite 現在在測試執行後會刪除對測試的引用,因此,重複使用 TestSuite 來重新執行一組測試的測試框架可能會失敗。 測試套件不應以這種方式重複使用,因為它意味著在測試執行之間保留了狀態,從而破壞了 unittest 旨在提供的測試隔離。 但是,如果認為缺乏隔離是可以接受的,則可以透過建立定義一個不做任何事情的 _removeTestAtIndex 方法的 TestSuite 子類來恢復舊的行為(請參閱 TestSuite.__iter__())(bpo-11798)。

  • unittest 現在使用 argparse 進行命令列解析。 某些以前可以正常工作的無效命令形式現在不再允許; 從理論上講,這不應導致向後相容性問題,因為不允許的命令形式沒有任何意義,並且不太可能被使用。

  • 當要匹配的字串是 類位元組物件 時,re.split()re.findall()re.sub() 函式,以及 match 物件的 group()groups() 方法現在始終返回一個 bytes 物件。 以前,返回型別與輸入型別匹配,因此,如果你的程式碼依賴於返回值為,例如,bytearray,則你需要更改程式碼。

  • 如果傳遞字串輸入,audioop 函式現在會立即引發錯誤,而不是稍後隨機失敗(bpo-16685)。

  • 新的 convert_charrefs 引數對於 HTMLParser 類,目前為了向後相容,預設值為 False,但最終會更改為預設值 True。建議你在程式碼中所有呼叫 HTMLParser 的地方都新增此關鍵字,並賦予適當的值 (bpo-13633)。

  • 由於 hmac.new() 函式的 digestmod 引數在未來將沒有預設值,因此所有對 hmac.new() 的呼叫都應該修改為顯式指定 digestmod (bpo-17276)。

  • 使用 SO 鍵呼叫 sysconfig.get_config_var(),或者在呼叫 sysconfig.get_config_vars() 的結果中查詢 SO 是不推薦的。這個鍵應該根據上下文替換為 EXT_SUFFIXSHLIB_SUFFIX (bpo-19555)。

  • 所有指定了 Uopen 函式呼叫都應該修改。U 在 Python 3 中無效,如果使用最終會引發錯誤。根據函式的不同,可以使用 newline 引數來實現其舊的 Python 2 行為,或者如果需要,可以將流包裝在 TextIOWrapper 中以使用其 newline 引數 (bpo-15204)。

  • 如果在指令碼中使用 pyvenv 並且不希望安裝 pip,則必須在命令呼叫中新增 --without-pip

  • 當指定縮排時,json.dump()json.dumps() 的預設行為已更改:它不再在行尾項分隔逗號後產生尾隨空格。 只有當你的測試對這種輸出進行空格敏感的比較時,這才會產生影響 (bpo-16333)。

  • doctest 現在會在擴充套件模組的 __doc__ 字串中查詢 doctest,因此如果你的 doctest 測試發現包含具有看起來像 doctest 的內容的擴充套件模組,那麼在執行測試時可能會看到以前從未見過的測試失敗 (bpo-3158)。

  • 作為 Python 啟動改進的一部分,collections.abc 模組已稍作重構。因此,匯入 collections 不再自動匯入 collections.abc。 如果你的程式依賴於(未文件化的)隱式匯入,則需要新增顯式的 import collections.abc (bpo-20784)。

C API 中的更改

在 3.4.3 中更改

PEP 476:預設啟用 stdlib HTTP 客戶端的證書驗證

http.client 以及使用它的模組,例如 urllib.requestxmlrpc.client,現在預設情況下會驗證伺服器是否提供由平臺信任儲存中的 CA 簽名的證書,並且該證書的主機名與請求的主機名匹配,從而顯著提高許多應用程式的安全性。

對於需要舊行為的應用程式,它們可以傳遞一個替代的上下文

import urllib.request
import ssl

# This disables all verification
context = ssl._create_unverified_context()

# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")

urllib.request.urlopen("https://invalid-cert", context=context)