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 中沒有新增新的語法特性。
其他新特性
改進了對非文字編碼的編解碼器處理(多個問題)。
匯入系統的ModuleSpec 型別 (PEP 451)。(影響匯入器作者。)
新的庫模組
selectors
:高階和高效的 I/O 多路複用,建立在select
模組原語之上(PEP 3156 的一部分)。statistics
:一個基本的數值穩定的統計庫 (PEP 450)。
顯著改進的庫模組
email
有一個新的子模組contentmanager
和一個新的Message
子類 (EmailMessage
),它簡化了 MIME 處理 (bpo-18891)。inspect
和pydoc
模組現在能夠正確地內省更多種類的可呼叫物件,這改進了 Pythonhelp()
系統的輸出。ipaddress
模組的 API 已宣告為穩定。
安全改進
使新建立的檔案描述符不可繼承 (PEP 446) 以避免將檔案描述符洩漏給子程序。
multiprocessing
現在有 一個避免在 Unix 上使用 os.fork 的選項。 spawn 和 forkserver 更加安全,因為它們避免了與子程序共享資料。Windows 上的
multiprocessing
子程序不再繼承父程序的所有可繼承控制代碼,而只繼承必要的控制代碼。新的
hashlib.pbkdf2_hmac()
函式提供了 PKCS#5 基於密碼的金鑰派生函式 2。標準庫中所有支援 SSL 的模組現在都支援伺服器證書驗證,包括主機名匹配 (
ssl.match_hostname()
) 和 CRL(證書吊銷列表,請參閱ssl.SSLContext.load_verify_locations()
)。
CPython 實現改進
利用 PEP 442,在大多數情況下,模組全域性變數在終結期間不再設定為 None (bpo-18214)。
請繼續閱讀,以獲取面向使用者的更改的完整列表,包括許多其他較小的改進、CPython 最佳化、棄用和潛在的移植問題。
新功能¶
PEP 453:在 Python 安裝中顯式引導 PIP¶
預設引導 pip¶
新的 ensurepip
模組(在 PEP 453 中定義)提供了一個標準的跨平臺機制,用於將 pip 安裝程式引導到 Python 安裝和虛擬環境中。Python 3.4.0 中包含的 pip
版本是 pip
1.5.4,未來的 3.4.x 維護版本會將捆綁的版本更新為建立候選版本時可用的最新版本 pip
。
預設情況下,命令 pipX
和 pipX.Y
將安裝在所有平臺上(其中 X.Y 代表 Python 安裝的版本),以及 pip
Python 包及其依賴項。在 Windows 和所有平臺上的虛擬環境中,還將安裝未版本化的 pip
命令。在其他平臺上,系統範圍的未版本化 pip
命令通常指的是單獨安裝的 Python 2 版本。
pyvenv
命令列實用程式和 venv
模組使用 ensurepip
模組,使 pip
在虛擬環境中隨時可用。使用命令列實用程式時,預設安裝 pip
,而使用 venv
模組的 API 時,必須顯式請求安裝 pip
。
對於 CPython POSIX 系統上的原始碼構建,make install
和 make altinstall
命令預設引導 pip
。此行為可以透過配置選項控制,並透過 Makefile 選項覆蓋。
在 Windows 和 Mac OS X 上,CPython 安裝程式現在預設安裝 pip
以及 CPython 本身(使用者可以選擇在安裝過程中不安裝它)。Windows 使用者需要選擇加入自動 PATH
修改,才能預設從命令列使用 pip
,否則仍然可以透過 Windows 的 Python 啟動器作為 py -m pip
訪問。
如 PEP 中所述,平臺打包者可以選擇不預設安裝這些命令,只要在呼叫時,它們提供關於如何在該平臺上安裝這些命令的清晰而簡單的指導(通常使用系統包管理器)。
注意
為了避免並行 Python 2 和 Python 3 安裝之間的衝突,當直接呼叫 ensurepip
時,預設只引導版本化的 pip3
和 pip3.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 文字模型的緊密耦合,特別是內建的str
、bytes
和bytearray
型別的型別限制便利方法,在歷史上掩蓋了這一事實。
作為澄清情況的關鍵一步,codecs.encode()
和codecs.decode()
便利函式現在在 Python 2.7、3.3 和 3.4 中正確記錄。這些函式自 Python 2.4 以來就存在於codecs
模組中(並且已包含在迴歸測試套件中),但以前只能透過執行時內省發現。
與str
、bytes
和bytearray
上的便利方法不同,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-17828 和 bpo-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 中貢獻。)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-18690 和 bpo-19078 中貢獻。)由於 Argument Clinic 的引入以及對
inspect
和pydoc
模組的其他更改,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
後,可以使用捆綁的 pip
將 pip
升級到比捆綁版本更新的版本。(請注意,這樣一個升級版本的 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 中貢獻了此功能。)
新類 ABC
以 ABCMeta
作為其元類。使用 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
類現在接受 encoding 和 errors 引數,這些引數會傳遞給 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,而以前需要 bytes
或 bytearray
例項。(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 引數,但接受 unixfrom 和 policy 引數。Message
的 __bytes__()
方法會呼叫它,這意味著 bytes(mymsg)
現在將產生直觀的結果:包含完整格式化訊息的位元組物件。(由 R. David Murray 在 bpo-18600 中貢獻。)
Message.set_param()
訊息現在接受 replace 關鍵字引數。指定後,將更新關聯的標頭,而不會更改其在標頭列表中的位置。為了向後相容,預設值為 False
。(由 R. David Murray 在 bpo-18891 中貢獻。)
已新增一對新的 Message
子類(EmailMessage
和 MIMEPart
),以及一個新的子模組 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_size
和 name
屬性的新增(以及 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 中貢獻。)
HTMLParser
的 strict 引數現已棄用。(由 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 對話方塊中獲取此檔案。
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,這意味著 runpy
和 python -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-18929 和 bpo-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 中貢獻。)
SocketHandler
和 DatagramHandler
現在支援 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¶
multiprocessing¶
在 Unix 系統上,為使用multiprocessing
啟動程序,添加了兩種新的啟動方法,spawn
和 forkserver
。這些方法使程序與執行緒的混合更加健壯,並且 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
開關)在使用 spawn
或 forkserver
啟動方法時,在子程序中正確地初始化 __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
經過增強,可以更有效地處理生成器、yield
和 yield 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
自省 API,使其能夠為更廣泛的可呼叫物件提供簽名信息。此更改還意味著在顯示幫助資訊時會考慮 inspect.signature()
__wrapped__
屬性。(由 Larry Hastings 在 bpo-19674 中貢獻。)
模組不再為已經繫結的方法顯示 pydoc
self
引數。相反,它旨在始終顯示所提供的可呼叫物件的精確當前簽名。(由 Larry Hastings 在 bpo-20710 中貢獻。)
除了對
進行的直接更改外,pydoc
模組的底層更改也大大改進了它對自定義 inspect
__dir__
方法和各種描述符行為的處理。
re¶
新的
函式和 fullmatch()
regex.fullmatch()
方法將模式錨定到字串的兩端進行匹配。這提供了一種明確表達匹配目標的方法,從而避免了一類在程式碼更改或向現有正則表示式新增替代項時丟失 $
字元的細微錯誤。(由 Matthew Barnett 在 bpo-16203 中貢獻。)
現在 regex 物件
的 repr 包括模式和標誌;現在 match 物件
的 repr 包括開始位置、結束位置以及匹配的字串部分。(由 Hugo Lopes Tavares 和 Serhiy Storchaka 在 bpo-13592 和 bpo-17087 中貢獻。)
resource¶
新的 prlimit()
函式,在核心版本為 2.6.36 或更高版本且 glibc 為 2.13 或更高版本的 Linux 平臺上可用,提供了查詢或設定除進行呼叫的程序之外的其他程序的資源限制的能力。(由 Christian Heimes 在 bpo-16595 中貢獻。)
在 Linux 核心版本 2.6.36 或更高版本上,還有一些新的特定於 Linux 的常量:RLIMIT_MSGQUEUE
、RLIMIT_NICE
、RLIMIT_RTPRIO
、RLIMIT_RTTIME
和 RLIMIT_SIGPENDING
。(由 Christian Heimes 在 bpo-19324 中貢獻。)
在 FreeBSD 9 及更高版本中,有一些新的 FreeBSD 特定常量:RLIMIT_SBSIZE
、RLIMIT_SWAP
和 RLIMIT_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¶
SMTPServer
和 SMTPChannel
類現在接受一個 *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_1
和 PROTOCOL_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 的預設 cafile
和 capath
的路徑和環境變數的命名元組。這可以幫助除錯預設驗證問題。(由 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_DEFAULT
,VERIFY_CRL_CHECK_LEAF
,VERIFY_CRL_CHECK_CHAIN
或 VERIFY_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
擴充套件項:crlDistributionPoints
、calIssuers
和 OCSP
URI。(由 Christian Heimes 在 bpo-18379 中貢獻。)
stat¶
stat
模組現在由 _stat
中的 C 實現支援。需要 C 實現,因為大多數值都不是標準化的,並且是平臺相關的。(由 Christian Heimes 在 bpo-11016 中貢獻。)
該模組支援新的 ST_MODE
標誌,S_IFDOOR
、S_IFPORT
和 S_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
中刪除此屬性(或將其設定為其他可呼叫物件),在 PYTHONSTARTUP
、sitecustomize
或 usercustomize
中覆蓋它。(由 É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-18585 和 bpo-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_url
或 data
屬性,則所有相關的內部屬性都會更新。這意味著,例如,現在可以在多個 OpenerDirector.open()
呼叫中使用同一個 Request
物件,並使用不同的 data 引數,或者修改 Request
的 url
,而不是從頭開始重新計算它。還有一個新的 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=0
、i=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()
物件現在具有 readline
和 readlines
方法。(由 Toshio Kuratomi 在 bpo-17467 中貢獻。)
venv¶
venv
現在包含 csh
和 fish
shell 的啟用指令碼。(由 Andrew Svetlov 在 bpo-15417 中貢獻。)
EnvBuilder
和 create()
便利函式接受一個新的關鍵字引數 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.ElementTree
的 tostring()
和 tostringlist()
函式,以及 ElementTree
的 write()
方法,現在有一個 short_empty_elements 僅限關鍵字引數,用於控制是否以縮寫形式 (<tag />
) 或展開形式 (<tag></tag>
) 寫入沒有內容的元素。(由 Ariel Poliak 和 Serhiy Storchaka 在 bpo-14377 中貢獻。)
zipfile¶
writepy()
方法 PyZipFile
類有一個新的 filterfunc 選項,可以用來控制哪些目錄和檔案被新增到存檔中。例如,這可以用來排除存檔中的測試檔案。(由 Christian Tismer 在 bpo-19274 中貢獻。)
現在,ZipFile
和 PyZipfile
的 allowZip64 引數預設為 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 中使用引數診所,並且 pydoc
和 inspect
已相應更新。
預計用於程式內省的簽名元資料將作為 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,執行測試套件,並使用gcov
和 lcov 為 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 445 的
pyfailmalloc
工具識別並修復了許多與 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 中貢獻。)bz2
、lzma
和gzip
模組的open
函式現在支援x
(獨佔建立)模式。(由 Tim Heaney 和 Vajrasky Kok 在 bpo-19201、bpo-19222 和 bpo-19223 中貢獻。)
重大最佳化¶
UTF-32 解碼器現在快了 3 到 4 倍。(由 Serhiy Storchaka 在 bpo-14625 中貢獻。)
現在減少了集合的雜湊衝突成本。每個雜湊表探測現在會檢查一系列連續的相鄰鍵/雜湊對,然後再繼續在雜湊表中進行隨機探測。這利用了快取區域性性,使衝突解決的成本更低。衝突解決方法可以描述為線性探測和開放定址的混合體。其他線性探測的數量預設為 9。可以透過在編譯時將 LINEAR_PROBES 定義為任何值來更改此值。設定 LINEAR_PROBES=0 以完全關閉線性探測。(由 Raymond Hettinger 在 bpo-18771 中貢獻。)
直譯器啟動速度提高了約 30%。速度提升歸因於幾個措施。直譯器在啟動時載入的模組減少了,例如
re
、collections
和locale
模組及其依賴項不再預設匯入。marshal 模組已得到改進,可以更快地載入已編譯的 Python 程式碼。(由 Antoine Pitrou、Christian Heimes 和 Victor Stinner 在 bpo-19219、bpo-19218、bpo-19209、bpo-19205 和 bpo-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
,而不是 CRTmalloc
。人工基準測試顯示記憶體節省約 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
ABCload_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 中刪除。HTMLParser
的 strict 引數已被棄用。plistlib
的readPlist()
、writePlist()
、readPlistFromBytes()
和writePlistToBytes()
函式已被棄用,取而代之的是相應的新函式load()
、dump()
、loads()
和dumps()
。Data()
已被棄用,取而代之的是直接使用bytes
建構函式。sysconfig
鍵SO
已被棄用,它已被EXT_SUFFIX
取代。各種
open
函式接受的U
模式已被棄用。在 Python3 中,它沒有任何實際用途,應替換為適當使用io.TextIOWrapper
(如果需要)及其 newline 引數。已棄用
xml.etree.ElementTree.iterparse()
的 parser 引數,以及XMLParser()
的 html 引數。為了準備移除後者,所有傳遞給XMLParser
的引數都應透過關鍵字傳遞。
已棄用的特性¶
已移除¶
不再支援的作業系統¶
以下作業系統的支援已從原始碼和構建工具中移除
API 和功能移除¶
以下過時和之前已棄用的 API 和功能已被移除
未維護的
Misc/TextMate
和Misc/vim
目錄已被移除(有關替代方案的建議,請參閱 devguide)。SO
makefile 宏已移除(它已被SHLIB_SUFFIX
和EXT_SUFFIX
宏取代)(bpo-16754)。PyThreadState.tick_counter
欄位已被移除;自從 Python 3.2 引入“新 GIL”以來,它的值已無意義 (bpo-19199)。PyLoader
和PyPycLoader
已從importlib
中移除。(由 Taras Lyapun 在 bpo-15641 中貢獻。)HTTPConnection
和HTTPSConnection
的 strict 引數已被移除。不再支援 HTTP 0.9 風格的“簡單響應”。已棄用的
urllib.request.Request
getter 和 setter 方法add_data
、has_data
、get_data
、get_type
、get_host
、get_selector
、set_proxy
、get_origin_req_host
和is_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.bjunk
和x in sm.bpopular
,其中 sm 是SequenceMatcher
物件 (bpo-13248)。
程式碼清理¶
移植到 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
。這是為了發出警告,即匯入會將這些檔案覆蓋為普通檔案,而不管它們最初的檔案路徑型別是什麼。當載入的原始碼觸發
SyntaxError
或UnicodeDecodeError
時,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)。移除
HTTPConnection
和HTTPSConnection
的 strict 引數,如果你是按位置而不是按關鍵字指定剩餘的引數,則會改變這些引數的含義。如果你一直關注棄用警告,你的程式碼應該已經透過關鍵字指定任何額外的引數。現在,
from __future__ import ...
語句之間的字串總是會引發SyntaxError
。 以前,如果沒有前導文件字串,則有時會忽略中間的字串。 這使 CPython 符合語言規範;Jython 和 PyPy 已經符合。(bpo-17434)。ssl.SSLSocket.getpeercert()
和ssl.SSLSocket.do_handshake()
現在當SSLSocket
未連線時,會引發帶有ENOTCONN
的OSError
,而不是之前的引發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 套接字呼叫
read
或write
會引發資訊豐富的ValueError
,而不是先前更神秘的AttributeError
(bpo-9177)。slice.indices()
不再為巨大的值產生OverflowError
。 作為此修復的結果,如果給定負長度,slice.indices()
現在會引發ValueError
;之前它會返回無意義的值(bpo-14794)。與
cmath
函式不同,complex
建構函式錯誤地接受了float
值,如果物件的__complex__
特殊方法返回一個值。 現在,這會引發TypeError
。(bpo-16290。)3.2 和 3.3 中的
int
建構函式錯誤地接受了 base 引數的float
值。 很少有人會這樣做,但如果有人這樣做,現在會引發TypeError
(bpo-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_SUFFIX
或SHLIB_SUFFIX
(bpo-19555)。所有指定了
U
的open
函式呼叫都應該修改。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 中的更改¶
PyEval_EvalFrameEx()
,PyObject_Repr()
和PyObject_Str()
,以及其他一些內部 C API,現在包含一個除錯斷言,以確保它們不會在可能靜默丟棄當前活動的異常的情況下使用。在預期和希望丟棄活動異常的情況下(例如,因為它已經用PyErr_Fetch()
本地儲存,或者正在被故意替換為不同的異常),需要顯式呼叫PyErr_Clear()
以避免在呼叫這些操作(直接或間接)並針對啟用了斷言的 Python 版本執行時觸發斷言。當
PyErr_SetImportError()
的 msg 引數未設定時,它現在會設定TypeError
。 以前,只返回NULL
且未設定任何異常。PyOS_ReadlineFunctionPointer
回撥的結果現在必須是由PyMem_RawMalloc()
或PyMem_RawRealloc()
分配的字串,或者如果發生錯誤,則為NULL
,而不是由PyMem_Malloc()
或PyMem_Realloc()
分配的字串 (bpo-16742)PyThread_set_key_value()
現在始終設定值。 在 Python 3.3 中,如果鍵已存在(如果當前值是非-NULL
指標),則該函式不執行任何操作。為了修復一個錯誤,
PyFrameObject
結構的f_tstate
(執行緒狀態) 欄位已被刪除:有關基本原理,請參閱 bpo-14432。
在 3.4.3 中更改¶
PEP 476:預設啟用 stdlib HTTP 客戶端的證書驗證¶
http.client
以及使用它的模組,例如 urllib.request
和 xmlrpc.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)