Python 3.11 中的新功能¶
- 編輯:
Pablo Galindo Salgado
本文解釋了 Python 3.11 相對於 3.10 的新功能。Python 3.11 於 2022 年 10 月 24 日釋出。有關完整詳細資訊,請參閱 更新日誌。
摘要 – 釋出亮點¶
Python 3.11 比 Python 3.10 快 10-60%。平均而言,我們在標準基準測試套件上測得 1.25 倍的加速。有關詳細資訊,請參閱 更快的 CPython。
新語法功能
新的內建功能
新的標準庫模組
直譯器的改進
新的
-P
命令列選項和PYTHONSAFEPATH
環境變數,用於 停用自動將可能不安全的路徑新增到sys.path
新的型別特性
重要的廢棄、移除和限制
PEP 594: 許多遺留的標準庫模組已被廢棄,並將在 Python 3.13 中移除
新功能¶
PEP 657: 追溯中更精細的錯誤位置¶
現在,在列印追溯時,直譯器將指向導致錯誤的精確表示式,而不僅僅是行。例如
Traceback (most recent call last):
File "distance.py", line 11, in <module>
print(manhattan_distance(p1, p2))
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "distance.py", line 6, in manhattan_distance
return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'
以前的直譯器版本只會指向行,使得哪個物件是 None
變得模糊不清。這些增強的錯誤在處理深度巢狀的 dict
物件和多個函式呼叫時也很有幫助
Traceback (most recent call last):
File "query.py", line 37, in <module>
magic_arithmetic('foo')
File "query.py", line 18, in magic_arithmetic
return add_counts(x) / 25
^^^^^^^^^^^^^
File "query.py", line 24, in add_counts
return 25 + query_user(user1) + query_user(user2)
^^^^^^^^^^^^^^^^^
File "query.py", line 32, in query_user
return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable
以及複雜的算術表示式
Traceback (most recent call last):
File "calculation.py", line 54, in <module>
result = (x / y / z) * (a / b / c)
~~~~~~^~~
ZeroDivisionError: division by zero
此外,增強的追溯功能所使用的資訊可透過通用 API 獲得,該 API 可用於關聯 位元組碼 指令 與原始碼位置。此資訊可以使用以下方法檢索
Python 中的
codeobject.co_positions()
方法。C API 中的
PyCode_Addr2Location()
函式。
有關更多詳細資訊,請參閱 PEP 657。(由 Pablo Galindo、Batuhan Taskaya 和 Ammar Askar 在 bpo-43950 中貢獻。)
備註
此功能要求在 程式碼物件 中儲存列位置,這可能會導致直譯器記憶體使用量和編譯後的 Python 檔案磁碟使用量略有增加。為了避免儲存額外資訊並停用列印額外追溯資訊,請使用 -X no_debug_ranges
命令列選項或 PYTHONNODEBUGRANGES
環境變數。
PEP 654: 異常組和 except*
¶
PEP 654 引入了語言功能,使程式能夠同時引發和處理多個不相關的異常。內建型別 ExceptionGroup
和 BaseExceptionGroup
使得可以將異常分組並一起引發,新的 except*
語法將 except
泛化以匹配異常組的子組。
有關更多詳細資訊,請參閱 PEP 654。
(由 Irit Katriel 在 bpo-45292 中貢獻。PEP 由 Irit Katriel、Yury Selivanov 和 Guido van Rossum 編寫。)
PEP 678: 異常可添加註釋¶
add_note()
方法已新增到 BaseException
。它可用於為異常新增在引發異常時不可用的上下文資訊。新增的註釋會出現在預設追溯中。
有關更多詳細資訊,請參閱 PEP 678。
(由 Irit Katriel 在 bpo-45607 中貢獻。PEP 由 Zac Hatfield-Dodds 編寫。)
Windows py.exe
啟動器改進¶
Python 3.11 中包含的 Python 安裝管理器 副本已顯著更新。它現在支援 PEP 514 中定義的公司/標籤語法,使用 -V:<company>/<tag>
引數,而不是有限的 -<major>.<minor>
。這允許啟動 python.org 上託管的 PythonCore
之外的分發。
使用 -V:
選擇器時,可以省略公司或標籤,但會搜尋所有安裝。例如,-V:OtherPython/
將選擇為 OtherPython
註冊的“最佳”標籤,而 -V:3.11
或 -V:/3.11
將選擇標籤為 3.11
的“最佳”分發。
使用舊的 -<major>
、-<major>.<minor>
、-<major>-<bitness>
或 -<major>.<minor>-<bitness>
引數時,所有現有行為都應保留與過去版本相同,並且只會選擇 PythonCore
的發行版。然而,-64
字尾現在意味著“非 32 位”(不一定是 x86-64),因為有多個受支援的 64 位平臺。32 位執行時透過檢查執行時的標籤是否包含 -32
字尾來檢測。自 3.5 以來,所有 Python 版本都在其 32 位構建中包含了此後綴。
其他語言更改¶
現在允許在 非同步函式 的推導式中使用非同步 推導式。在這種情況下,外部推導式會隱式變為非同步。(由 Serhiy Storchaka 在 bpo-33346 中貢獻。)
對於不支援 上下文管理器 協議的物件,在
with
語句和contextlib.ExitStack.enter_context()
中現在會引發TypeError
而不是AttributeError
;對於不支援 非同步上下文管理器 協議的物件,在async with
語句和contextlib.AsyncExitStack.enter_async_context()
中也一樣。(由 Serhiy Storchaka 在 bpo-12022 和 bpo-44471 中貢獻。)添加了
object.__getstate__()
,它提供了__getstate__()
方法的預設實現。複製copy
和pickle
內建型別bytearray
、set
、frozenset
、collections.OrderedDict
、collections.deque
、weakref.WeakSet
和datetime.tzinfo
的子類例項現在會複製和 pickle 作為 槽 實現的例項屬性。此更改具有意外的副作用:它會絆倒少數現有 Python 專案,這些專案不期望object.__getstate__()
存在。有關此類程式碼可能需要的變通方法的討論,請參閱 gh-70766 上的後續評論。(由 Serhiy Storchaka 在 bpo-26579 中貢獻。)
添加了
-P
命令列選項和PYTHONSAFEPATH
環境變數,它們會停用在執行指令碼時將指令碼目錄自動新增到sys.path
,或者在使用-c
和-m
時將當前目錄自動新增到sys.path
。這確保import
只會查詢標準庫和已安裝的模組,並避免無意或惡意地使用本地(通常是使用者可寫)目錄中的模組來遮蓋模組。(由 Victor Stinner 在 gh-57684 中貢獻。)格式化規範迷你語言 中添加了一個
"z"
選項,它在舍入到格式精度後將負零強制轉換為正零。有關更多詳細資訊,請參閱 PEP 682。(由 John Belmonte 在 gh-90153 中貢獻。)sys.path
不再接受位元組。在 Python 3.2 和 3.6 之間某個時候,位元組支援中斷了,直到 Python 3.10.0 釋出後才有人注意到。此外,由於-b
和sys.path_importer_cache
在str
和bytes
鍵混合時會發生互動,恢復支援會很麻煩。(由 Thomas Grainger 在 gh-91181 中貢獻。)
其他 CPython 實現變更¶
為
complex
實現了特殊方法__complex__()
,為bytes
實現了__bytes__()
,以支援typing.SupportsComplex
和typing.SupportsBytes
協議。(由 Mark Dickinson 和 Donghee Na 在 bpo-24234 中貢獻。)siphash13
被新增為新的內部雜湊演算法。它與siphash24
具有相似的安全屬性,但對於長輸入來說速度稍快。str
、bytes
和其他一些型別現在將其用作hash()
的預設演算法。PEP 552 基於雜湊的 .pyc 檔案 現在也使用siphash13
。(由 Inada Naoki 在 bpo-29410 中貢獻。)當活動異常由不帶引數的
raise
語句重新引發時,附加到此異常的追溯現在始終是sys.exc_info()[1].__traceback__
。這意味著在當前except
子句中對追溯所做的更改會反映在重新引發的異常中。(由 Irit Katriel 在 bpo-45711 中貢獻。)直譯器狀態中已處理異常的表示(即
exc_info
或_PyErr_StackItem
)現在只有exc_value
欄位;exc_type
和exc_traceback
已被移除,因為它們可以從exc_value
派生。(由 Irit Katriel 在 bpo-45711 中貢獻。)Windows 安裝程式已新增新的 命令列選項
AppendPath
。它的行為與PrependPath
類似,但它會將安裝和指令碼目錄附加到路徑,而不是預置。(由 Bastian Neuburger 在 bpo-44934 中貢獻。)現在必須將
PyConfig.module_search_paths_set
欄位設定為1
,初始化才能使用PyConfig.module_search_paths
來初始化sys.path
。否則,初始化將重新計算路徑並替換新增到module_search_paths
的任何值。--help
選項的輸出現在適用於 50 行/80 列。有關 Python 環境變數 和-X
選項的資訊現在可以透過相應的--help-env
和--help-xoptions
標誌以及新的--help-all
獲得。(由 Éric Araujo 在 bpo-46142 中貢獻。)在除 2 (二進位制)、4、8 (八進位制)、16 (十六進位制) 或 32 之外的基數(例如基數 10 (十進位制))中,
int
和str
之間的轉換,如果字串形式的數字位數超過限制,現在會引發ValueError
>,以避免由於演算法複雜性而導致的潛在拒絕服務攻擊。這是對 CVE 2020-10735 的緩解措施。此限制可以透過環境變數、命令列標誌或sys
API 進行配置或停用。請參閱 整數字符串轉換長度限制 文件。預設限制是字串形式的 4300 位數字。
新模組¶
改進的模組¶
asyncio¶
添加了
TaskGroup
類,它是一個 非同步上下文管理器,包含一組任務,退出時會等待所有任務。對於新程式碼,建議使用此方法,而不是直接使用create_task()
和gather()
。(由 Yury Selivanov 等人於 gh-90908 貢獻。)添加了
timeout()
,一個用於設定非同步操作超時的非同步上下文管理器。對於新程式碼,建議使用此方法,而不是直接使用wait_for()
。(由 Andrew Svetlov 在 gh-90927 中貢獻。)添加了
Runner
類,它暴露了run()
使用的機制。(由 Andrew Svetlov 在 gh-91218 中貢獻。)在 asyncio 庫的同步原語中添加了
Barrier
類,以及相關的BrokenBarrierError
異常。(由 Yves Duprat 和 Andrew Svetlov 在 gh-87518 中貢獻。)向
asyncio.loop.create_connection()
添加了關鍵字引數 all_errors,以便可以將多個連線錯誤作為ExceptionGroup
丟擲。添加了
asyncio.StreamWriter.start_tls()
方法,用於將現有基於流的連線升級到 TLS。(由 Ian Good 在 bpo-34975 中貢獻。)向事件迴圈添加了原始資料報套接字函式:
sock_sendto()
、sock_recvfrom()
和sock_recvfrom_into()
。這些在SelectorEventLoop
和ProactorEventLoop
中都有實現。(由 Alex Grönholm 在 bpo-46805 中貢獻。)向
Task
添加了cancelling()
和uncancel()
方法。這些主要用於內部使用,特別是由TaskGroup
使用。
contextlib¶
dataclasses¶
datetime¶
添加了
datetime.UTC
,作為datetime.timezone.utc
的便捷別名。(由 Kabir Kwatra 在 gh-91973 中貢獻。)datetime.date.fromisoformat()
、datetime.time.fromisoformat()
和datetime.datetime.fromisoformat()
現在可以解析大多數 ISO 8601 格式(僅排除那些支援小數小時和分鐘的格式)。(由 Paul Ganssle 在 gh-80010 中貢獻。)
enum¶
將
EnumMeta
重新命名為EnumType
(EnumMeta
仍保留為別名)。添加了
StrEnum
,其成員可以用作(且必須是)字串。添加了
ReprEnum
,它只修改成員的__repr__()
,同時為__str__()
和__format__()
(由str()
、format()
和 f-string 使用)返回其字面值(而不是名稱)。更改了
Enum.__format__()
(format()
、str.format()
和 f-string 的預設值)以始終產生與Enum.__str__()
相同的結果:對於繼承自ReprEnum
的列舉,它將是成員的值;對於所有其他列舉,它將是列舉和成員名稱(例如Color.RED
)。為
Flag
列舉和FlagBoundary
列舉添加了新的 boundary 類引數及其選項,以控制如何處理超出範圍的標誌值。添加了
member()
和nonmember()
裝飾器,以確保被裝飾的物件是/不是列舉成員。添加了
property()
裝飾器,它像property()
一樣工作,但用於列舉。使用它而不是types.DynamicClassAttribute()
。添加了
global_enum()
列舉裝飾器,它調整__repr__()
和__str__()
,以將值顯示為模組的成員,而不是列舉類。例如,re.RegexFlag
的ASCII
成員顯示為're.ASCII'
,而不是'RegexFlag.ASCII'
。增強了
Flag
以支援對其成員使用len()
、迭代和in
/not in
。例如,現在以下程式碼可以工作:len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)
更改了
Enum
和Flag
,以便在呼叫__init_subclass__()
之前定義成員;dir()
現在包含來自混合資料型別的方法等。更改了
Flag
,使其只將主要值(2 的冪)視為規範值,而將複合值(3
、6
、10
等)視為別名;反轉的標誌會強制轉換為其正等效值。
fcntl¶
在 FreeBSD 上,支援
F_DUP2FD
和F_DUP2FD_CLOEXEC
標誌,前者等同於dup2
用法,後者則額外設定了FD_CLOEXEC
標誌。
fractions¶
functools¶
functools.singledispatch()
現在支援將types.UnionType
和typing.Union
作為排程引數的註解。>>> from functools import singledispatch >>> @singledispatch ... def fun(arg, verbose=False): ... if verbose: ... print("Let me just say,", end=" ") ... print(arg) ... >>> @fun.register ... def _(arg: int | float, verbose=False): ... if verbose: ... print("Strength in numbers, eh?", end=" ") ... print(arg) ... >>> from typing import Union >>> @fun.register ... def _(arg: Union[list, set], verbose=False): ... if verbose: ... print("Enumerate this:") ... for i, elem in enumerate(arg): ... print(i, elem) ...
(由 Yurii Karabas 在 bpo-46014 中貢獻。)
gzip¶
當
gzip.compress()
函式與 mtime=0 引數一起使用時,速度更快,因為它將壓縮完全委託給單個zlib.compress()
操作。此更改有一個副作用:gzip 檔案頭包含一個“OS”位元組。傳統上,gzip
模組總是將其設定為代表“未知”的值 255。現在,當使用 mtime=0 呼叫compress()
時,它可能會被 Python 連結到的底層 zlib C 庫設定為不同的值。(有關副作用的詳細資訊,請參閱 gh-112346。)
hashlib¶
hashlib.blake2b()
和hashlib.blake2s()
現在更喜歡 libb2,而不是 Python 內建的副本。(由 Christian Heimes 在 bpo-47095 中貢獻。)SHA3 和 SHAKE 演算法的內部
_sha3
模組現在使用 *tiny_sha3* 而不是 *Keccak Code Package*,以減少程式碼和二進位制大小。hashlib
模組更喜歡 OpenSSL 中最佳化的 SHA3 和 SHAKE 實現。此更改僅影響沒有 OpenSSL 支援的安裝。(由 Christian Heimes 在 bpo-47098 中貢獻。)添加了
hashlib.file_digest()
,一個用於高效雜湊檔案或類檔案物件的輔助函式。(由 Christian Heimes 在 gh-89313 中貢獻。)
IDLE 和 idlelib¶
inspect¶
新增
getmembers_static()
以返回所有成員,而不會透過描述符協議觸發動態查詢。(由 Weipeng Hong 在 bpo-30533 中貢獻。)新增
ismethodwrapper()
用於檢查物件的型別是否為MethodWrapperType
。(由 Hakan Çelik 在 bpo-29418 中貢獻。)更改了
inspect
模組中與幀相關的函式,以返回新的FrameInfo
和Traceback
類例項(與以前的 命名元組 類似介面向後相容),其中包括擴充套件的 PEP 657 位置資訊(結束行號、列和結束列)。受影響的函式包括(由 Pablo Galindo 在 gh-88116 中貢獻。)
locale¶
新增
locale.getencoding()
以獲取當前 locale 編碼。它類似於locale.getpreferredencoding(False)
,但忽略 Python UTF-8 模式。
logging¶
添加了
getLevelNamesMapping()
以返回日誌級別名稱(例如'CRITICAL'
)到其相應 日誌級別 值(例如預設情況下為50
)的對映。(由 Andrei Kulakovin 在 gh-88024 中貢獻。)為
SysLogHandler
添加了createSocket()
方法,以匹配SocketHandler.createSocket()
。它在處理程式初始化期間和在沒有活動套接字時發出事件時自動呼叫。(由 Kirill Pinchuk 在 gh-88457 中貢獻。)
math¶
新增
math.exp2()
:返回 2 的 x 次冪。(由 Gideon Mitchell 在 bpo-45917 中貢獻。)新增
math.cbrt()
:返回 x 的立方根。(由 Ajith Ramachandran 在 bpo-44357 中貢獻。)為了與 IEEE 754 規範保持一致,更改了兩個
math.pow()
角點情況的行為。操作math.pow(0.0, -math.inf)
和math.pow(-0.0, -math.inf)
現在返回inf
。以前它們會引發ValueError
。(由 Mark Dickinson 在 bpo-44339 中貢獻。)
operator¶
添加了一個新函式
operator.call
,使得operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)
。(由 Antony Lee 在 bpo-44019 中貢獻。)
os¶
在 Windows 上,
os.urandom()
現在使用BCryptGenRandom()
,而不是已廢棄的CryptGenRandom()
。(由 Donghee Na 在 bpo-44611 中貢獻。)
pathlib¶
re¶
原子分組 (
(?>...)
) 和佔有式量詞 (*+
,++
,?+
,{m,n}+
) 現在在正則表示式中受支援。(由 Jeffrey C. Jacobs 和 Serhiy Storchaka 在 bpo-433030 中貢獻。)
shutil¶
在
shutil.rmtree()
中新增可選引數 dir_fd。(由 Serhiy Storchaka 在 bpo-46245 中貢獻。)
socket¶
新增對 NetBSD 的 CAN Socket 支援。(由 Thomas Klausner 在 bpo-30512 中貢獻。)
create_connection()
有一個選項,在連線失敗時,丟擲包含所有錯誤的ExceptionGroup
>,而不是隻丟擲最後一個錯誤。(由 Irit Katriel 在 bpo-29980 中貢獻。)
sqlite3¶
現在可以透過將
None
傳遞給set_authorizer()
來停用授權器。(由 Erlend E. Aasland 在 bpo-44491 中貢獻。)create_collation()
的排序規則名稱現在可以包含任何 Unicode 字元。包含無效字元的排序規則名稱現在會引發UnicodeEncodeError
而不是sqlite3.ProgrammingError
。(由 Erlend E. Aasland 在 bpo-44688 中貢獻。)sqlite3
異常現在包含 SQLite 擴充套件錯誤程式碼作為sqlite_errorcode
,以及 SQLite 錯誤名稱作為sqlite_errorname
。(由 Aviv Palivoda、Daniel Shahaf 和 Erlend E. Aasland 在 bpo-16379 和 bpo-24139 中貢獻。)在
sqlite3.Connection
中添加了setlimit()
和getlimit()
,用於按連線設定和獲取 SQLite 限制。(由 Erlend E. Aasland 在 bpo-45243 中貢獻。)sqlite3
現在根據底層 SQLite 庫編譯時使用的預設執行緒模式設定sqlite3.threadsafety
。(由 Erlend E. Aasland 在 bpo-45613 中貢獻。)sqlite3
C 回撥現在在啟用回撥追溯時使用不可引發的異常。使用者現在可以註冊不可引發的 鉤子 處理程式
以改善他們的除錯體驗。(由 Erlend E. Aasland 在 bpo-45828 中貢獻。)回滾後獲取不再引發
InterfaceError
。相反,我們讓 SQLite 庫處理這些情況。(由 Erlend E. Aasland 在 bpo-44092 中貢獻。)在
sqlite3.Connection
中添加了serialize()
和deserialize()
,用於序列化和反序列化資料庫。(由 Erlend E. Aasland 在 bpo-41930 中貢獻。)在
sqlite3.Connection
中新增create_window_function()
,用於建立聚合視窗函式。(由 Erlend E. Aasland 在 bpo-34916 中貢獻)。在
sqlite3.Connection
中新增blobopen()
。sqlite3.Blob
允許對 BLOB 進行增量 I/O 操作。(由 Aviv Palivoda 和 Erlend E. Aasland 在 bpo-24905 中貢獻)。
string¶
向
string.Template
新增get_identifiers()
和is_valid()
,它們分別返回所有有效的佔位符,以及是否存在任何無效的佔位符。(由 Ben Kehoe 在 gh-90465 中貢獻)。
sys¶
sys.exc_info()
現在從value
(異常例項) 派生type
和traceback
欄位,因此當異常在處理過程中被修改時,這些更改會反映在後續呼叫exc_info()
的結果中。(由 Irit Katriel 在 bpo-45711 中貢獻)。新增
sys.exception()
,它返回活動的異常例項 (等同於sys.exc_info()[1]
)。(由 Irit Katriel 在 bpo-46328 中貢獻)。新增
sys.flags.safe_path
標誌。(由 Victor Stinner 在 gh-57684 中貢獻)。
sysconfig¶
新增了三個 安裝方案(*posix_venv*、*nt_venv* 和 *venv*),它們在 Python 建立新的虛擬環境或從虛擬環境執行時使用。前兩個方案(*posix_venv* 和 *nt_venv*)是針對非 Windows 和 Windows 的作業系統特定方案,而 *venv* 實際上是根據 Python 執行的作業系統而對其中一個方案的別名。這對於修改
sysconfig.get_preferred_scheme()
的下游分發商非常有用。建立新虛擬環境的第三方程式碼應使用新的 *venv* 安裝方案來確定路徑,就像venv
所做的那樣。(由 Miro Hrončok 在 bpo-45413 中貢獻)。
tempfile¶
SpooledTemporaryFile
物件現在完全實現了io.BufferedIOBase
或io.TextIOBase
的方法(取決於檔案模式)。這使得它們可以與期望檔案類物件的 API (例如壓縮模組) 正確工作。(由 Carey Metcalfe 在 gh-70363 中貢獻)。
threading¶
在 Unix 上,如果 C 庫中提供了
sem_clockwait()
函式(glibc 2.30 及更高版本),則threading.Lock.acquire()
方法現在使用單調時鐘 (time.CLOCK_MONOTONIC
) 作為超時,而不是使用系統時鐘 (time.CLOCK_REALTIME
),以避免受系統時鐘變化的影響。(由 Victor Stinner 在 bpo-41710 中貢獻)。
時間¶
在 Unix 上,
time.sleep()
現在使用clock_nanosleep()
或nanosleep()
函式(如果可用),其解析度為 1 納秒(10-9 秒),而不是使用解析度為 1 微秒(10-6 秒)的select()
。(由 Benjamin Szőke 和 Victor Stinner 在 bpo-21302 中貢獻)。在 Windows 8.1 及更高版本中,
time.sleep()
現在使用基於 高解析度計時器 的可等待計時器,其解析度為 100 納秒(10-7 秒)。之前,它的解析度為 1 毫秒(10-3 秒)。(由 Benjamin Szőke、Donghee Na、Eryk Sun 和 Victor Stinner 在 bpo-21302 和 bpo-45429 中貢獻)。
tkinter¶
添加了方法
info_patchlevel()
,它以與sys.version_info
類似的具名元組形式返回 Tcl 庫的精確版本。(由 Serhiy Storchaka 在 gh-91827 中貢獻)。
traceback¶
新增
traceback.StackSummary.format_frame_summary()
,允許使用者覆蓋哪些幀出現在回溯中,以及如何格式化它們。(由 Ammar Askar 在 bpo-44569 中貢獻)。新增
traceback.TracebackException.print()
,它將格式化的TracebackException
例項列印到檔案。(由 Irit Katriel 在 bpo-33809 中貢獻)。
typing¶
有關主要更改,請參見 與型別提示相關的新特性。
新增
typing.assert_never()
和typing.Never
。typing.assert_never()
對於要求型別檢查器確認一行程式碼不可達很有用。在執行時,它會引發AssertionError
。(由 Jelle Zijlstra 在 gh-90633 中貢獻)。新增
typing.reveal_type()
。這對於要求型別檢查器推斷給定表示式的型別很有用。在執行時,它會列印接收值的型別。(由 Jelle Zijlstra 在 gh-90572 中貢獻)。新增
typing.assert_type()
。這對於要求型別檢查器確認其推斷的給定表示式的型別與給定型別匹配很有用。在執行時,它只是返回接收到的值。(由 Jelle Zijlstra 在 gh-90638 中貢獻)。typing.TypedDict
型別現在可以是泛型的。(由 Samodya Abeysiriwardane 在 gh-89026 中貢獻)。NamedTuple
型別現在可以是泛型的。(由 Serhiy Storchaka 在 bpo-43923 中貢獻)。允許
typing.Any
的子類化。這對於避免與高度動態類(例如模擬物件)相關的型別檢查器錯誤很有用。(由 Shantanu Jain 在 gh-91154 中貢獻)。typing.final()
裝飾器現在在被裝飾的物件上設定__final__
屬性。(由 Jelle Zijlstra 在 gh-90500 中貢獻)。typing.get_overloads()
函式可用於內省函式的過載。typing.clear_overloads()
可用於清除函式的所有已註冊過載。(由 Jelle Zijlstra 在 gh-89263 中貢獻)。Protocol
子類的__init__()
方法現在得以保留。(由 Adrian Garcia Badarasco 在 gh-88970 中貢獻)。空元組型別 (
Tuple[()]
) 的表示被簡化。這會影響內省,例如get_args(Tuple[()])
現在求值為()
而不是((),)
。(由 Serhiy Storchaka 在 gh-91137 中貢獻)。透過移除私有
typing._type_check
函式中的可呼叫檢查,放寬了型別註釋的執行時要求。(由 Gregory Beauregard 在 gh-90802 中貢獻)。typing.get_type_hints()
現在支援在 PEP 585 泛型別名 中將字串評估為前向引用。(由 Niklas Rosenstein 在 gh-85542 中貢獻)。typing.get_type_hints()
不再向預設值為None
的引數新增Optional
。(由 Nikita Sobolev 在 gh-90353 中貢獻)。typing.get_type_hints()
現在支援評估裸字串化ClassVar
註釋。(由 Gregory Beauregard 在 gh-90711 中貢獻)。typing.no_type_check()
不再修改外部類和函式。它現在也正確地將類方法標記為不進行型別檢查。(由 Nikita Sobolev 在 gh-90729 中貢獻)。
unicodedata¶
Unicode 資料庫已更新至版本 14.0.0。(由 Benjamin Peterson 在 bpo-45190 中貢獻)。
unittest¶
添加了
TestCase
類的enterContext()
和enterClassContext()
方法,IsolatedAsyncioTestCase
類的enterAsyncContext()
方法以及unittest.enterModuleContext()
函式。(由 Serhiy Storchaka 在 bpo-45046 中貢獻)。
venv¶
建立新的 Python 虛擬環境時,會使用 *venv* sysconfig 安裝方案 來確定環境內的路徑。當 Python 在虛擬環境中執行時,相同的安裝方案是預設的。這意味著下游分發商可以在不改變虛擬環境行為的情況下更改預設的 sysconfig 安裝方案。建立新虛擬環境的第三方程式碼也應該這樣做。(由 Miro Hrončok 在 bpo-45413 中貢獻)。
warnings¶
warnings.catch_warnings()
現在接受warnings.simplefilter()
的引數,提供了一種更簡潔的方式來區域性忽略警告或將其轉換為錯誤。(由 Zac Hatfield-Dodds 在 bpo-47074 中貢獻)。
zipfile¶
新增了在
ZipFile
目錄和檔案頭中指定成員名編碼以讀取元資料的支援。(由 Stephen J. Turnbull 和 Serhiy Storchaka 在 bpo-28080 中貢獻)。新增了
ZipFile.mkdir()
,用於在 ZIP 歸檔中建立新目錄。(由 Sam Ezeh 在 gh-49083 中貢獻)。為
zipfile.Path
添加了stem
、suffix
和suffixes
。(由 Miguel Brito 在 gh-88261 中貢獻)。
最佳化¶
本節介紹與 更快的 CPython 專案無關的特定最佳化,該專案在單獨的章節中介紹。
編譯器現在優化了字串字面量中只包含格式程式碼
%s
、%r
和%a
的簡單 printf 風格的 % 格式化,使其與相應的 f 字串 表示式一樣快。(由 Serhiy Storchaka 在 bpo-28307 中貢獻)。整數除法 (
//
) 更好地針對編譯器最佳化進行了調整。在 x86-64 上,當用小於2**30
的值除以int
時,它的速度現在提高了大約 20%。(由 Gregory P. Smith 和 Tim Peters 在 gh-90564 中貢獻)。對於小於
2**30
的整數,sum()
現在快了近 30%。(由 Stefan Behnel 在 gh-68264 中貢獻)。列表大小調整在常見情況下得到了最佳化,將
list.append()
的速度提高了約 15%,簡單的 列表推導式 提高了 20-30%。(由 Dennis Sweeney 在 gh-91165 中貢獻)。當所有鍵都是 Unicode 物件時,字典不再儲存雜湊值,從而減小了
dict
的大小。例如,在 64 位平臺上,sys.getsizeof(dict.fromkeys("abcdefg"))
從 352 位元組減少到 272 位元組(小 23%)。(由 Inada Naoki 在 bpo-46845 中貢獻)。在使用
asyncio.DatagramProtocol
透過 UDP 傳輸大檔案時,現在速度快了幾個數量級,對於約 60 MiB 的檔案,速度提高了 100 多倍。(由 msoxzw 在 gh-91487 中貢獻)。math
函式comb()
和perm()
對於大引數現在快了約 10 倍(對於更大的 *k*,加速更大)。(由 Serhiy Storchaka 在 bpo-37295 中貢獻)。statistics
函式mean()
、variance()
和stdev()
現在以一次性遍歷的方式消耗迭代器,而不是先將其轉換為list
。這使速度提高了一倍,並可以節省大量記憶體。(由 Raymond Hettinger 在 gh-90415 中貢獻)。unicodedata.normalize()
現在以常數時間規範化純 ASCII 字串。(由 Donghee Na 在 bpo-44987 中貢獻)。
更快的 CPython¶
在 Ubuntu Linux 上使用 GCC 編譯時,CPython 3.11 在 pyperformance 基準測試套件中,平均比 CPython 3.10 快 25%。根據您的工作負載,整體加速可能在 10-60% 之間。
該專案專注於 Python 的兩個主要領域:更快的啟動 和 更快的執行時。不在此專案範圍內的最佳化將在 最佳化 部分單獨列出。
更快的啟動¶
凍結匯入 / 靜態程式碼物件¶
Python 將 位元組碼 快取在 __pycache__ 目錄中,以加快模組載入。
以前在 3.10 中,Python 模組執行過程如下
Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate
在 Python 3.11 中,Python 啟動所需的核心模組是“凍結”的。這意味著它們的 程式碼物件(和位元組碼)由直譯器靜態分配。這減少了模組執行過程中的步驟,變為
Statically allocated code object -> Evaluate
Python 3.11 的直譯器啟動速度現在快了 10-15%。這對於使用 Python 的短時執行程式影響很大。
(由 Eric Snow、Guido van Rossum 和 Kumar Aditya 在許多問題中貢獻)。
更快的執行時¶
更廉價、惰性的 Python 幀¶
每當 Python 呼叫 Python 函式時,都會建立儲存執行資訊的 Python 幀。以下是新的幀最佳化:
簡化了幀建立過程。
透過在 C 棧上大量重用幀空間來避免記憶體分配。
簡化了內部幀結構,使其只包含基本資訊。幀以前包含額外的除錯和記憶體管理資訊。
舊式的 幀物件 現在只在偵錯程式請求或 Python 內省函式(如 sys._getframe()
和 inspect.currentframe()
)請求時建立。對於大多數使用者程式碼,根本不建立幀物件。因此,幾乎所有 Python 函式呼叫都顯著加速。我們在 pyperformance 中測量到 3-7% 的加速。(由 Mark Shannon 在 bpo-44590 中貢獻)。
(由 Mark Shannon 在 bpo-44590 中貢獻)。
內聯 Python 函式呼叫¶
在 Python 函式呼叫期間,Python 將呼叫一個求值 C 函式來解釋該函式的程式碼。這有效地將純 Python 遞迴限制在 C 棧的安全範圍內。
在 3.11 中,當 CPython 檢測到 Python 程式碼呼叫另一個 Python 函式時,它會設定一個新幀,並“跳到”新幀中的新程式碼。這完全避免了呼叫 C 解釋函式。
大多數 Python 函式呼叫現在不消耗 C 棧空間,從而加快了它們的速度。在簡單的遞迴函式(如斐波那契或階乘)中,我們觀察到 1.7 倍的加速。這也意味著遞迴函式可以遞迴更深(如果使用者使用 sys.setrecursionlimit()
增加了遞迴限制)。我們在 pyperformance 中測量到 1-3% 的改進。
(由 Pablo Galindo 和 Mark Shannon 在 bpo-45256 中貢獻)。
PEP 659: 特化自適應直譯器¶
PEP 659 是 Faster CPython 專案的關鍵部分之一。其基本思想是,儘管 Python 是一種動態語言,但大多數程式碼都有物件和型別很少變化的區域。這個概念被稱為 *型別穩定性*。
在執行時,Python 將嘗試在執行程式碼中尋找常見模式和型別穩定性。然後,Python 將當前操作替換為更專業的特殊操作。這種特殊操作使用只有這些用例/型別才可用的快速路徑,通常比其通用對應項表現更好。這還引入了另一個概念,稱為 *內聯快取*,其中 Python 將昂貴操作的結果直接快取在 位元組碼 中。
特化器還將某些常見的指令對組合成一個超指令,從而減少執行期間的開銷。
Python 只會在看到“熱”程式碼(執行多次)時進行特化。這可以防止 Python 浪費時間在一次性程式碼上。當代碼過於動態或用途發生變化時,Python 也可以取消特化。特化會定期嘗試,並且特化嘗試的成本不高,這使得特化能夠適應新情況。
(PEP 由 Mark Shannon 編寫,靈感來自 Stefan Brunthaler 的想法。有關更多資訊,請參見 PEP 659。由 Mark Shannon 和 Brandt Bucher 實現,Irit Katriel 和 Dennis Sweeney 提供了額外幫助)。
操作 |
形式 |
專業化 |
操作加速 (最高) |
貢獻者 |
---|---|---|---|---|
二元運算 |
|
10% |
Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney |
|
下標 |
|
下標容器型別,例如 自定義 |
10-25% |
Irit Katriel, Mark Shannon |
儲存下標 |
|
類似於上面的下標特化。 |
10-25% |
Dennis Sweeney |
呼叫 |
|
20% |
Mark Shannon, Ken Jin |
|
載入全域性變數 |
|
物件在全域性/內建名稱空間中的索引被快取。載入全域性和內建變數無需名稱空間查詢。 |
Mark Shannon |
|
載入屬性 |
|
類似於載入全域性變數。屬性在類/物件的名稱空間中的索引被快取。在大多數情況下,屬性載入不需要名稱空間查詢。 |
Mark Shannon |
|
呼叫方法 |
|
方法的實際地址被快取。現在方法載入沒有名稱空間查詢——即使對於具有長繼承鏈的類也是如此。 |
10-20% |
Ken Jin, Mark Shannon |
儲存屬性 |
|
類似於載入屬性最佳化。 |
在 pyperformance 中提高 2% |
Mark Shannon |
解包序列 |
|
8% |
Brandt Bucher |
其他¶
由於惰性建立的物件名稱空間,物件現在需要更少的記憶體。它們的名稱空間字典現在也更自由地共享鍵。(由 Mark Shannon 在 bpo-45340 和 bpo-40116 中貢獻)。
實現了“零成本”異常,消除了在未引發異常時
try
語句的開銷。(由 Mark Shannon 在 bpo-40222 中貢獻)。直譯器中更簡潔的異常表示將捕獲異常所需的時間減少了約 10%。(由 Irit Katriel 在 bpo-45711 中貢獻)。
re
的正則表示式匹配引擎已部分重構,現在在支援的平臺上使用計算 goto(或“執行緒程式碼”)。因此,Python 3.11 執行 pyperformance 正則表示式基準測試 的速度比 Python 3.10 快 10%。(由 Brandt Bucher 在 gh-91404 中貢獻)。
常見問題¶
我應該如何編寫程式碼來利用這些加速?¶
編寫遵循常見最佳實踐的 Pythonic 程式碼;您無需更改程式碼。Faster CPython 專案優化了我們觀察到的常見程式碼模式。
CPython 3.11 會使用更多記憶體嗎?¶
可能不會;我們預計記憶體使用量不會超過 3.10 的 20%。這可以透過上面提到的幀物件和物件字典的記憶體最佳化來抵消。
我的工作負載中沒有看到任何加速。為什麼?¶
某些程式碼不會有明顯的收益。如果您的程式碼大部分時間花在 I/O 操作上,或者大部分計算已經在 NumPy 等 C 擴充套件庫中完成,則不會有顯著的加速。該專案目前對純 Python 工作負載的收益最大。
此外,pyperformance 的資料是幾何平均值。即使在 pyperformance 基準測試中,某些基準測試略有減慢,而另一些則加速了近 2 倍!
有 JIT 編譯器嗎?¶
沒有。我們仍在探索其他最佳化。
關於¶
Faster CPython 探索了 CPython 的最佳化。主要團隊由微軟資助,全職從事這項工作。Pablo Galindo Salgado 也由 Bloomberg LP 資助,兼職從事該專案。最後,許多貢獻者是社群的志願者。
CPython 位元組碼變更¶
位元組碼現在包含內聯快取條目,它們以新新增的 CACHE
指令的形式存在。許多操作碼期望後面跟著確切數量的快取,並指示直譯器在執行時跳過它們。填充的快取可以看起來像任意指令,因此在讀取或修改包含加速資料的原始、自適應位元組碼時應格外小心。
新操作碼¶
ASYNC_GEN_WRAP
、RETURN_GENERATOR
和SEND
,用於生成器和協程。COPY_FREE_VARS
,避免了閉包所需的特殊呼叫者側程式碼。JUMP_BACKWARD_NO_INTERRUPT
,用於某些不希望處理中斷的迴圈。CHECK_EG_MATCH
和PREP_RERAISE_STAR
,用於處理 PEP 654 中新增的 新的異常組和 except*。PUSH_EXC_INFO
,用於異常處理程式。RESUME
,一個無操作,用於內部跟蹤、除錯和最佳化檢查。
替換的操作碼¶
替換的操作碼 |
新操作碼 |
備註 |
---|---|---|
BINARY_* INPLACE_* |
將所有數值二元/原地操作碼替換為單個操作碼 |
|
CALL_FUNCTION CALL_FUNCTION_KW CALL_METHOD |
將方法的引數移位與關鍵字引數處理解耦;允許更好的呼叫特化 |
|
DUP_TOP DUP_TOP_TWO ROT_TWO ROT_THREE ROT_FOUR ROT_N |
棧操作指令 |
|
JUMP_IF_NOT_EXC_MATCH |
現在執行檢查但不跳轉 |
|
JUMP_ABSOLUTE POP_JUMP_IF_FALSE POP_JUMP_IF_TRUE |
參見 [3];每個方向的 |
|
SETUP_WITH SETUP_ASYNC_WITH |
|
|
所有跳轉操作碼現在都是相對的,包括現有的 JUMP_IF_TRUE_OR_POP
和 JUMP_IF_FALSE_OR_POP
。引數現在是相對於當前指令的偏移量,而不是絕對位置。
更改/移除的操作碼¶
更改了
MATCH_CLASS
和MATCH_KEYS
,使其不再推送一個額外的布林值來指示成功/失敗。相反,在失敗時,會推送None
來代替提取值的元組。更改了處理異常的操作碼,以反映它們現在在棧上表示為一個項,而不是三個項(請參閱 gh-89874)。
移除了
COPY_DICT_WITHOUT_KEYS
、GEN_START
、POP_BLOCK
、SETUP_FINALLY
和YIELD_FROM
。
已棄用¶
本節列出了 Python 3.11 中已棄用的 Python API。
已棄用的 C API 單獨列出。
語言/內建¶
連結
classmethod
描述符(在 bpo-19072 中引入)現在已棄用。它不能再用於包裝其他描述符,例如property
。此功能的核心設計存在缺陷,並導致了一些下游問題。要“傳遞”一個classmethod
,請考慮使用 Python 3.10 中新增的__wrapped__
屬性。(由 Raymond Hettinger 在 gh-89519 中貢獻)。字串和位元組字面量中八進位制轉義符的值大於
0o377
(十進位制 255)現在會產生DeprecationWarning
。在未來的 Python 版本中,它們將引發SyntaxWarning
,並最終引發SyntaxError
。(由 Serhiy Storchaka 在 gh-81548 中貢獻)。int()
對__trunc__()
的委託現在已棄用。當type(a)
實現了__trunc__()
但沒有實現__int__()
或__index__()
時,呼叫int(a)
現在會引發DeprecationWarning
。(由 Zackery Spytz 在 bpo-44977 中貢獻)。
模組¶
PEP 594 導致以下模組被棄用,並計劃在 Python 3.13 中移除:
aifc
chunk
msilib
pipes
telnetlib
audioop
crypt
nis
sndhdr
uu
cgi
imghdr
nntplib
spwd
xdrlib
cgitb
mailcap
ossaudiodev
sunau
(由 Brett Cannon 在 bpo-47061 和 Victor Stinner 在 gh-68966 中貢獻)。
asynchat
、asyncore
和smtpd
模組自 Python 3.6 以來已被棄用。它們的文件和棄用警告已更新,以指出它們將在 Python 3.12 中移除。(由 Hugo van Kemenade 在 bpo-47022 中貢獻)。lib2to3
包和2to3
工具現已棄用,可能無法解析 Python 3.10 或更高版本。有關詳細資訊,請參見引入新 PEG 解析器的 PEP 617。(由 Victor Stinner 在 bpo-40360 中貢獻)。未文件化的模組
sre_compile
、sre_constants
和sre_parse
現已棄用。(由 Serhiy Storchaka 在 bpo-47152 中貢獻)。
標準庫¶
以下內容已在
configparser
中自 Python 3.2 以來被棄用。它們的棄用警告現已更新,以指出它們將在 Python 3.12 中移除:configparser.SafeConfigParser
類configparser.ParsingError.filename
屬性configparser.RawConfigParser.readfp()
方法
(由 Hugo van Kemenade 在 bpo-45173 中貢獻)。
configparser.LegacyInterpolation
自 Python 3.2 以來在文件字串中已棄用,並且未在configparser
文件中列出。它現在會發出DeprecationWarning
,並將在 Python 3.13 中移除。請改用configparser.BasicInterpolation
或configparser.ExtendedInterpolation
。(由 Hugo van Kemenade 在 bpo-46607 中貢獻)。較舊的
importlib.resources
函式集已棄用,取而代之的是 Python 3.9 中新增的新函式,並且將在未來的 Python 版本中移除,因為它們不支援包子目錄中的資源:importlib.resources.contents()
importlib.resources.is_resource()
importlib.resources.open_binary()
importlib.resources.open_text()
importlib.resources.read_binary()
importlib.resources.read_text()
importlib.resources.path()
locale.getdefaultlocale()
函式已棄用,並將在 Python 3.15 中移除。請改用locale.setlocale()
、locale.getpreferredencoding(False)
和locale.getlocale()
函式。(由 Victor Stinner 在 gh-90817 中貢獻)。locale.resetlocale()
函式已棄用,並將在 Python 3.13 中移除。請改用locale.setlocale(locale.LC_ALL, "")
。(由 Victor Stinner 在 gh-90817 中貢獻)。現在,針對 正則表示式 中的數字組引用和組名將應用更嚴格的規則。現在,只有 ASCII 數字序列才會被接受為數字引用,並且
bytes
模式和替換字串中的組名只能包含 ASCII 字母、數字和下劃線。目前,違反這些規則的語法會引發棄用警告。(由 Serhiy Storchaka 在 gh-91760 中貢獻)。在
re
模組中,re.template()
函式以及相應的re.TEMPLATE
和re.T
標誌已棄用,因為它們未文件化且缺乏明確的目的。它們將在 Python 3.13 中移除。(由 Serhiy Storchaka 和 Miro Hrončok 在 gh-92728 中貢獻)。turtle.settiltangle()
自 Python 3.1 以來已被棄用;它現在會發出棄用警告,並將在 Python 3.13 中移除。請改用turtle.tiltangle()
(它之前被錯誤地標記為已棄用,現在其文件字串已更正)。(由 Hugo van Kemenade 在 bpo-45837 中貢獻)。typing.Text
僅用於提供 Python 2 和 Python 3 程式碼之間的相容性支援,現已棄用。目前尚未計劃將其移除,但鼓勵使用者在可能的情況下使用str
。(由 Alex Waygood 在 gh-92332 中貢獻)。用於構建
typing.TypedDict
型別的關鍵字引數語法現已棄用。Python 3.13 中將移除支援。(由 Jingchen Ye 在 gh-90224 中貢獻)。webbrowser.MacOSX
已棄用,並將在 Python 3.13 中移除。它未經測試,未文件化,並且webbrowser
本身不使用它。(由 Donghee Na 在 bpo-42255 中貢獻)。從
TestCase
和IsolatedAsyncioTestCase
測試方法返回非預設None
值的行為現在已被棄用。棄用了以下未正式文件化的
unittest
函式,計劃在 Python 3.13 中移除:unittest.findTestCases()
unittest.makeSuite()
unittest.getTestCaseNames()
請改用
TestLoader
方法:(由 Erlend E. Aasland 在 bpo-5846 中貢獻)。
unittest.TestProgram.usageExit()
被標記為已棄用,將在 3.13 中移除。(由 Carlos Damázio 在 gh-67048 中貢獻)。
計劃在 Python 3.12 中移除¶
以下 Python API 已在之前的 Python 版本中棄用,並將在 Python 3.12 中移除。
計劃移除的 C API 單獨列出。
asynchat
模組asyncore
模組imp
模組typing.io
名稱空間typing.re
名稱空間cgi.log()
importlib.find_loader()
importlib.abc.Loader.module_repr()
importlib.abc.MetaPathFinder.find_module()
importlib.abc.PathEntryFinder.find_loader()
importlib.abc.PathEntryFinder.find_module()
importlib.machinery.BuiltinImporter.find_module()
importlib.machinery.BuiltinLoader.module_repr()
importlib.machinery.FileFinder.find_loader()
importlib.machinery.FileFinder.find_module()
importlib.machinery.FrozenImporter.find_module()
importlib.machinery.FrozenLoader.module_repr()
importlib.machinery.PathFinder.find_module()
importlib.machinery.WindowsRegistryFinder.find_module()
importlib.util.module_for_loader()
importlib.util.set_loader_wrapper()
importlib.util.set_package_wrapper()
pkgutil.ImpImporter
pkgutil.ImpLoader
pathlib.Path.link_to()
sqlite3.enable_shared_cache()
sqlite3.OptimizedUnicode()
PYTHONTHREADDEBUG
環境變數以下
unittest
中已棄用的別名:已棄用的別名
方法名
棄用版本
failUnless
3.1
failIf
3.1
failUnlessEqual
3.1
failIfEqual
3.1
failUnlessAlmostEqual
3.1
failIfAlmostEqual
3.1
failUnlessRaises
3.1
assert_
3.2
assertEquals
3.2
assertNotEquals
3.2
assertAlmostEquals
3.2
assertNotAlmostEquals
3.2
assertRegexpMatches
3.2
assertRaisesRegexp
3.2
assertNotRegexpMatches
3.5
已移除¶
本節列出了 Python 3.11 中已移除的 Python API。
已移除的 C API 單獨列出。
移除了
@asyncio.coroutine()
裝飾器,該裝飾器曾使基於舊版生成器的協程能夠與async
/await
程式碼相容。此函式自 Python 3.8 起已被棄用,並原定於 Python 3.10 中移除。請改用async def
。(由 Illia Volochii 在 bpo-43216 中貢獻。)移除了
asyncio.coroutines.CoroWrapper
,該類用於在除錯模式下包裝基於舊版生成器的協程物件。(由 Illia Volochii 在 bpo-43216 中貢獻。)由於重大的安全問題,
asyncio.loop.create_datagram_endpoint()
的 reuse_address 引數(在 Python 3.9 中停用)現在已完全移除。這是由於SO_REUSEADDR
套接字選項在 UDP 中的行為所致。(由 Hugo van Kemenade 在 bpo-45129 中貢獻。)移除了
binhex
模組,該模組在 Python 3.9 中已被棄用。同時移除了相關且同樣已被棄用的binascii
函式:binascii.a2b_hqx()
binascii.b2a_hqx()
binascii.rlecode_hqx()
binascii.rldecode_hqx()
binascii.crc_hqx()
函式仍然可用。(由 Victor Stinner 在 bpo-45085 中貢獻。)
移除了
distutils
的bdist_msi
命令,該命令在 Python 3.9 中已被棄用。請改用bdist_wheel
(wheel 包)。(由 Hugo van Kemenade 在 bpo-45124 中貢獻。)移除了
xml.dom.pulldom.DOMEventStream
、wsgiref.util.FileWrapper
和fileinput.FileInput
的__getitem__()
方法,這些方法自 Python 3.9 起已被棄用。(由 Hugo van Kemenade 在 bpo-45132 中貢獻。)移除了已棄用的
gettext
函式lgettext()
、ldgettext()
、lngettext()
和ldngettext()
。同時移除了bind_textdomain_codeset()
函式、NullTranslations.output_charset()
和NullTranslations.set_output_charset()
方法,以及translation()
和install()
的 codeset 引數,因為它們僅用於l*gettext()
函式。(由 Donghee Na 和 Serhiy Storchaka 在 bpo-44235 中貢獻。)從
inspect
模組中移除:getargspec()
函式,該函式自 Python 3.0 起已被棄用;請改用inspect.signature()
或inspect.getfullargspec()
。formatargspec()
函式,該函式自 Python 3.5 起已被棄用;請改用inspect.signature()
函式或直接使用inspect.Signature
物件。未文件化的
Signature.from_builtin()
和Signature.from_function()
方法,這些方法自 Python 3.5 起已被棄用;請改用Signature.from_callable()
方法。
(由 Hugo van Kemenade 在 bpo-45320 中貢獻。)
從
pathlib.PurePath
中移除了__class_getitem__()
方法,因為它未被使用且在早期版本中因錯誤而新增。(由 Nikita Sobolev 在 bpo-46483 中貢獻。)移除了
smtpd
模組中的MailmanProxy
類,因為它在沒有外部mailman
包的情況下無法使用。(由 Donghee Na 在 bpo-35800 中貢獻。)移除了
_tkinter.TkappType
中已棄用的split()
方法。(由 Erlend E. Aasland 在 bpo-38371 中貢獻。)移除了
unittest
發現功能中的名稱空間包支援。該功能在 Python 3.4 中引入,但自 Python 3.7 起已損壞。(由 Inada Naoki 在 bpo-23882 中貢獻。)移除了未文件化的私有
float.__set_format__()
方法,該方法在 Python 3.7 中曾被稱為float.__setformat__()
。其文件字串寫道:“您可能不想使用此函式。它主要用於 Python 的測試套件。”(由 Victor Stinner 在 bpo-46852 中貢獻。)--experimental-isolated-subinterpreters
配置標誌(以及相應的EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
宏)已被移除。Pynche —— Pythonic自然色彩和色調編輯器 —— 已從
Tools/scripts
移出,並 獨立於 Python 原始碼樹進行開發。
移植到 Python 3.11¶
本節列出了之前描述的更改以及 Python API 中可能需要更改您的 Python 程式碼的其他錯誤修復。
C API 的移植說明 單獨列出。
open()
、io.open()
、codecs.open()
和fileinput.FileInput
不再接受檔案模式中的'U'
(“通用換行符”)。在 Python 3 中,只要檔案以文字模式開啟,就預設使用“通用換行符”模式,並且'U'
標誌自 Python 3.3 起已被棄用。這些函式的 newline 引數 控制通用換行符的工作方式。(由 Victor Stinner 在 bpo-37330 中貢獻。)ast.AST
節點位置現在在提供給compile()
和其他相關函式時進行驗證。如果檢測到無效位置,將引發ValueError
。(由 Pablo Galindo 在 gh-93351 中貢獻)在 Python 3.8 中棄用後,禁止將非
concurrent.futures.ThreadPoolExecutor
執行器傳遞給asyncio.loop.set_default_executor()
。(由 Illia Volochii 在 bpo-43234 中貢獻。)calendar
:calendar.LocaleTextCalendar
和calendar.LocaleHTMLCalendar
類現在在未指定區域設定時使用locale.getlocale()
,而不是使用locale.getdefaultlocale()
。(由 Victor Stinner 在 bpo-46659 中貢獻。)pdb
模組現在使用'UTF-8'
編碼讀取.pdbrc
配置檔案。(由 Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) 在 bpo-41137 中貢獻。)random.sample()
的 population 引數必須是一個序列,不再支援將set
自動轉換為list
。此外,如果樣本大小大於總體大小,將引發ValueError
。(由 Raymond Hettinger 在 bpo-40465 中貢獻。)移除了
random.shuffle()
的 random 可選引數。它以前是用於洗牌的任意隨機函式;現在,將始終使用random.random()
(其先前的預設值)。在
re
正則表示式語法 中,全域性內聯標誌(例如(?i)
)現在只能在正則表示式的開頭使用。在其他地方使用它們自 Python 3.6 起已被棄用。(由 Serhiy Storchaka 在 bpo-47066 中貢獻。)在
re
模組中,修復了幾個長期存在的 bug,這些 bug 在極少數情況下可能導致捕獲組得到錯誤的結果。因此,這可能會改變這些情況下的捕獲輸出。(由 Ma Lin 在 bpo-35859 中貢獻。)
構建更改¶
CPython 現在對 WebAssembly 平臺 Emscripten (
wasm32-unknown-emscripten
,即瀏覽器中的 Python) 和 WebAssembly 系統介面 (WASI) (wasm32-unknown-wasi
) 具有 PEP 11 Tier 3 支援 的交叉編譯功能。此工作受到 Pyodide 等先前工作的啟發。這些平臺提供了 POSIX API 的有限子集;與網路、程序、執行緒、訊號、mmap 和使用者/組相關的 Python 標準庫功能和模組不可用或不起作用。(Emscripten 由 Christian Heimes 和 Ethan Smith 在 gh-84461 中貢獻,WASI 由 Christian Heimes 在 gh-90473 中貢獻;平臺在 gh-95085 中得到推廣)構建 CPython 現在需要
已移除
Py_NO_NAN
宏。由於 CPython 現在需要 IEEE 754 浮點數,因此 NaN 值始終可用。(由 Victor Stinner 在 bpo-46656 中貢獻。)tkinter
包現在需要 Tcl/Tk 8.5.12 或更高版本。(由 Serhiy Storchaka 在 bpo-46996 中貢獻。)大多數 stdlib 擴充套件模組的構建依賴項、編譯器標誌和連結器標誌現在由 configure 檢測。libffi、libnsl、libsqlite3、zlib、bzip2、liblzma、libcrypt、Tcl/Tk 和 uuid 標誌由 pkg-config(如果可用)檢測。
tkinter
現在需要 pkg-config 命令來檢測 Tcl/Tk 標頭檔案和庫的開發設定。(由 Christian Heimes 和 Erlend Egeberg Aasland 在 bpo-45847、bpo-45747 和 bpo-45763 中貢獻。)libpython 不再連結 libcrypt。(由 Mike Gilbert 在 bpo-45433 中貢獻。)
CPython 現在可以透過向
--with-lto
傳遞thin
選項,即--with-lto=thin
,來使用 ThinLTO 選項構建。(由 Donghee Na 和 Brett Holman 在 bpo-44340 中貢獻。)現在可以停用物件結構的空閒列表。新的 configure 選項
--without-freelists
可用於停用除空元組單例之外的所有空閒列表。(由 Christian Heimes 在 bpo-45522 中貢獻。)Modules/Setup
和Modules/makesetup
已得到改進和整合。現在可以透過makesetup
構建擴充套件模組。除了一些測試模組外,所有模組都可以靜態連結到主二進位制檔案或庫中。(由 Brett Cannon 和 Christian Heimes 在 bpo-45548、bpo-45570、bpo-45571 和 bpo-43974 中貢獻。)備註
使用環境變數
TCLTK_CFLAGS
和TCLTK_LIBS
手動指定 Tcl/Tk 標頭檔案和庫的位置。configure 選項--with-tcltk-includes
和--with-tcltk-libs
已被移除。在 RHEL 7 和 CentOS 7 上,開發包不提供
tcl.pc
和tk.pc
;請使用TCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5"
。目錄Misc/rhel7
包含.pc
檔案以及如何使用 RHEL 7 和 CentOS 7 的 Tcl/Tk 和 OpenSSL 構建 Python 的說明。CPython 現在預設將對 Python
int
實現使用 30 位數字。此前,預設是在SIZEOF_VOID_P >= 8
的平臺上使用 30 位數字,否則使用 15 位數字。仍然可以透過配置指令碼的--enable-big-digits
選項或(對於 Windows)PC/pyconfig.h
中的PYLONG_BITS_IN_DIGIT
變數顯式請求使用 15 位數字,但此選項可能會在未來的某個時候移除。(由 Mark Dickinson 在 bpo-45569 中貢獻。)
C API 更改¶
新功能¶
添加了一個新的
PyType_GetName()
函式以獲取型別的短名稱。(由 Hai Shi 在 bpo-42035 中貢獻。)添加了一個新的
PyType_GetQualName()
函式以獲取型別的限定名稱。(由 Hai Shi 在 bpo-42035 中貢獻。)為受限 C API 添加了新的
PyThreadState_EnterTracing()
和PyThreadState_LeaveTracing()
函式,用於暫停和恢復跟蹤和效能分析。(由 Victor Stinner 在 bpo-43760 中貢獻。)添加了
Py_Version
常量,其值與PY_VERSION_HEX
相同。(由 Gabriele N. Tornetta 在 bpo-43931 中貢獻。)Py_buffer
和 API 現在是受限 API 和穩定 ABI 的一部分bf_getbuffer
和bf_releasebuffer
型別槽
(由 Christian Heimes 在 bpo-45459 中貢獻。)
添加了
PyType_GetModuleByDef()
函式,用於在無法直接獲取此資訊(透過PyCMethod
)的情況下,獲取定義方法的模組。(由 Petr Viktorin 在 bpo-46613 中貢獻。)添加了新的函式以打包和解包 C double(序列化和反序列化):
PyFloat_Pack2()
、PyFloat_Pack4()
、PyFloat_Pack8()
、PyFloat_Unpack2()
、PyFloat_Unpack4()
和PyFloat_Unpack8()
。(由 Victor Stinner 在 bpo-46906 中貢獻。)添加了新的函式來獲取幀物件屬性:
PyFrame_GetBuiltins()
、PyFrame_GetGenerator()
、PyFrame_GetGlobals()
、PyFrame_GetLasti()
。添加了兩個新函式來獲取和設定當前活動異常例項:
PyErr_GetHandledException()
和PyErr_SetHandledException()
。它們是PyErr_SetExcInfo()
和PyErr_GetExcInfo()
的替代品,後者使用舊的異常三元組表示。(由 Irit Katriel 在 bpo-46343 中貢獻。)添加了
PyConfig.safe_path
成員。(由 Victor Stinner 在 gh-57684 中貢獻。)
移植到 Python 3.11¶
一些宏已轉換為靜態行內函數,以避免 宏陷阱。此更改對使用者而言應基本透明,因為替換函式將把其引數轉換為預期型別,以避免由於靜態型別檢查導致的編譯器警告。然而,當受限 C API 設定為 >=3.11 時,這些轉換不會進行,呼叫者需要將引數轉換為預期型別。有關更多詳細資訊,請參閱 PEP 670。(由 Victor Stinner 和 Erlend E. Aasland 在 gh-89653 中貢獻。)
PyErr_SetExcInfo()
不再使用type
和traceback
引數,直譯器現在從異常例項(value
引數)派生這些值。該函式仍然竊取所有三個引數的引用。(由 Irit Katriel 在 bpo-45711 中貢獻。)PyErr_GetExcInfo()
現在從異常例項(value
欄位)派生結果的type
和traceback
欄位。(由 Irit Katriel 在 bpo-45711 中貢獻。)_frozen
有一個新的is_package
欄位,用於指示凍結模組是否為包。此前,size
欄位中的負值是指示符。現在size
將只使用非負值。(由 Kumar Aditya 在 bpo-46608 中貢獻。)_PyFrameEvalFunction()
現在將其第二個引數從PyFrameObject*
改為_PyInterpreterFrame*
。有關如何使用此函式指標型別的更多詳細資訊,請參閱 PEP 523。PyCode_New()
和PyCode_NewWithPosOnlyArgs()
現在接受一個額外的exception_table
引數。應儘可能避免使用這些函式。要獲取自定義程式碼物件:使用編譯器建立一個程式碼物件,然後使用replace
方法獲取修改後的版本。PyCodeObject
不再有co_code
、co_varnames
、co_cellvars
和co_freevars
欄位。請改用PyCode_GetCode()
、PyCode_GetVarnames()
、PyCode_GetCellvars()
和PyCode_GetFreevars()
分別透過 C API 訪問它們。(由 Brandt Bucher 在 bpo-46841 和 Ken Jin 在 gh-92154 和 gh-94936 中貢獻。)舊的垃圾桶宏 (
Py_TRASHCAN_SAFE_BEGIN
/Py_TRASHCAN_SAFE_END
) 現已棄用。它們應替換為新的宏Py_TRASHCAN_BEGIN
和Py_TRASHCAN_END
。一個具有舊宏的 tp_dealloc 函式,例如
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_SAFE_BEGIN(p); ... Py_TRASHCAN_SAFE_END }
應按如下方式遷移到新宏
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_BEGIN(p, mytype_dealloc) ... Py_TRASHCAN_END }
請注意,
Py_TRASHCAN_BEGIN
有一個第二個引數,它應該是它所在的解除分配函式。為了在相同的程式碼庫中支援舊的 Python 版本,您可以定義以下宏並在整個程式碼中使用它們(鳴謝:這些是從
mypy
程式碼庫複製的)#if PY_VERSION_HEX >= 0x03080000 # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc) # define CPy_TRASHCAN_END(op) Py_TRASHCAN_END #else # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op) # define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op) #endif
如果型別定義時設定了
Py_TPFLAGS_HAVE_GC
標誌但沒有遍歷函式(PyTypeObject.tp_traverse
),PyType_Ready()
函式現在會引發錯誤。(由 Victor Stinner 在 bpo-44263 中貢獻。)具有
Py_TPFLAGS_IMMUTABLETYPE
標誌的堆型別現在可以繼承 PEP 590 vectorcall 協議。此前,這僅適用於 靜態型別。(由 Erlend E. Aasland 在 bpo-43908 中貢獻)由於
Py_TYPE()
已更改為內聯靜態函式,Py_TYPE(obj) = new_type
必須替換為Py_SET_TYPE(obj, new_type)
:請參閱Py_SET_TYPE()
函式(自 Python 3.9 起可用)。為了向後相容,可以使用此宏#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE) static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { ob->ob_type = type; } #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type) #endif
(由 Victor Stinner 在 bpo-39573 中貢獻。)
由於
Py_SIZE()
已更改為內聯靜態函式,Py_SIZE(obj) = new_size
必須替換為Py_SET_SIZE(obj, new_size)
:請參閱Py_SET_SIZE()
函式(自 Python 3.9 起可用)。為了向後相容,可以使用此宏#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE) static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) { ob->ob_size = size; } #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size) #endif
(由 Victor Stinner 在 bpo-39573 中貢獻。)
當
Py_LIMITED_API
宏設定為0x030b0000
(Python 3.11) 或更高版本時,<Python.h>
不再包含標頭檔案<stdlib.h>
、<stdio.h>
、<errno.h>
和<string.h>
。C 擴充套件應在#include <Python.h>
之後顯式包含這些標頭檔案。(由 Victor Stinner 在 bpo-45434 中貢獻。)非受限 API 檔案
cellobject.h
、classobject.h
、code.h
、context.h
、funcobject.h
、genobject.h
和longintrepr.h
已移至Include/cpython
目錄。此外,eval.h
標頭檔案已被移除。這些檔案不應直接包含,因為它們已包含在Python.h
中:包含檔案。如果已直接包含它們,請考慮改用Python.h
。(由 Victor Stinner 在 bpo-35134 中貢獻。)PyUnicode_CHECK_INTERNED()
宏已從受限 C API 中排除。它在那裡從未可用,因為它使用了受限 C API 中不可用的內部結構。(由 Victor Stinner 在 bpo-46007 中貢獻。)以下幀函式和型別現在可直接透過
#include <Python.h>
使用,不再需要新增#include <frameobject.h>
(由 Victor Stinner 在 gh-93937 中貢獻。)
PyFrameObject
結構成員已從公共 C API 中移除。雖然文件指出
PyFrameObject
欄位可能隨時更改,但它們已穩定很長時間,並被一些流行的擴充套件使用。在 Python 3.11 中,幀結構被重組以實現效能最佳化。一些欄位完全移除,因為它們是舊實現中的細節。
f_back
:使用PyFrame_GetBack()
。f_blockstack
:已移除。f_builtins
:使用PyFrame_GetBuiltins()
。f_code
:使用PyFrame_GetCode()
。f_gen
:使用PyFrame_GetGenerator()
。f_globals
:使用PyFrame_GetGlobals()
。f_iblock
:已移除。f_lasti
:使用PyFrame_GetLasti()
。使用PyCode_Addr2Line()
的程式碼應改用PyFrame_GetLineNumber()
;它可能更快。f_lineno
:使用PyFrame_GetLineNumber()
f_locals
:使用PyFrame_GetLocals()
。f_stackdepth
:已移除。f_state
:無公共 API(重新命名為f_frame.f_state
)。f_trace
:無公共 API。f_trace_lines
:使用PyObject_GetAttrString((PyObject*)frame, "f_trace_lines")
。f_trace_opcodes
:使用PyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes")
。f_localsplus
:無公共 API(重新命名為f_frame.localsplus
)。f_valuestack
:已移除。
Python 幀物件現在是惰性建立的。一個副作用是
f_back
成員不應直接訪問,因為它的值現在也是惰性計算的。必須呼叫PyFrame_GetBack()
函式。直接訪問
f_locals
的偵錯程式 必須 呼叫PyFrame_GetLocals()
。它們不再需要呼叫PyFrame_FastToLocalsWithError()
或PyFrame_LocalsToFast()
,實際上它們不應該呼叫這些函式。幀的必要更新現在由虛擬機器管理。在 Python 3.8 及更早版本上定義
PyFrame_GetCode()
的程式碼#if PY_VERSION_HEX < 0x030900B1 static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame) { Py_INCREF(frame->f_code); return frame->f_code; } #endif
在 Python 3.8 及更早版本上定義
PyFrame_GetBack()
的程式碼#if PY_VERSION_HEX < 0x030900B1 static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame) { Py_XINCREF(frame->f_back); return frame->f_back; } #endif
或者使用 pythoncapi_compat 專案 在舊版 Python 上獲取這兩個函式。
PyThreadState
結構成員的更改frame
:已移除,請使用PyThreadState_GetFrame()
(該函式在 bpo-40429 中新增到 Python 3.9)。警告:該函式返回 強引用,需要呼叫Py_XDECREF()
。tracing
:已更改,請使用PyThreadState_EnterTracing()
和PyThreadState_LeaveTracing()
(這些函式在 bpo-43760 中新增到 Python 3.11)。recursion_depth
:已移除,請改用(tstate->recursion_limit - tstate->recursion_remaining)
。stackcheck_counter
:已移除。
在 Python 3.8 及更早版本上定義
PyThreadState_GetFrame()
的程式碼#if PY_VERSION_HEX < 0x030900B1 static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate) { Py_XINCREF(tstate->frame); return tstate->frame; } #endif
在 Python 3.10 及更早版本上定義
PyThreadState_EnterTracing()
和PyThreadState_LeaveTracing()
的程式碼#if PY_VERSION_HEX < 0x030B00A2 static inline void PyThreadState_EnterTracing(PyThreadState *tstate) { tstate->tracing++; #if PY_VERSION_HEX >= 0x030A00A1 tstate->cframe->use_tracing = 0; #else tstate->use_tracing = 0; #endif } static inline void PyThreadState_LeaveTracing(PyThreadState *tstate) { int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL); tstate->tracing--; #if PY_VERSION_HEX >= 0x030A00A1 tstate->cframe->use_tracing = use_tracing; #else tstate->use_tracing = use_tracing; #endif } #endif
或者使用 pythoncapi-compat 專案 在舊版 Python 上獲取這些函式。
鼓勵分發商使用最佳化的 Blake2 庫 libb2 構建 Python。
PyConfig.module_search_paths_set
欄位現在必須設定為 1,以便初始化使用PyConfig.module_search_paths
初始化sys.path
。否則,初始化將重新計算路徑並替換新增到module_search_paths
的任何值。PyConfig_Read()
不再計算初始搜尋路徑,也不會填充任何值到PyConfig.module_search_paths
。要計算預設路徑並進行修改,請完成初始化並使用PySys_GetObject()
將sys.path
作為 Python 列表物件檢索並直接修改它。
已棄用¶
棄用以下函式以配置 Python 初始化
PySys_AddWarnOptionUnicode()
PySys_AddWarnOption()
PySys_AddXOption()
PySys_HasWarnOptions()
PySys_SetArgvEx()
PySys_SetArgv()
PySys_SetPath()
Py_SetPath()
Py_SetProgramName()
Py_SetPythonHome()
Py_SetStandardStreamEncoding()
_Py_SetProgramFullPath()
請改用 Python 初始化配置 的新
PyConfig
API(PEP 587)。(由 Victor Stinner 在 gh-88279 中貢獻。)棄用
PyBytesObject
的ob_shash
成員。請改用PyObject_Hash()
。(由 Inada Naoki 在 bpo-46864 中貢獻。)
Python 3.12 中待移除¶
以下 C API 已在早期的 Python 版本中棄用,並將在 Python 3.12 中移除。
PyUnicode_AS_DATA()
PyUnicode_AS_UNICODE()
PyUnicode_AsUnicodeAndSize()
PyUnicode_AsUnicode()
PyUnicode_FromUnicode()
PyUnicode_GET_DATA_SIZE()
PyUnicode_GET_SIZE()
PyUnicode_GetSize()
PyUnicode_IS_COMPACT()
PyUnicode_IS_READY()
PyUnicode_WSTR_LENGTH()
_PyUnicode_AsUnicode()
PyUnicode_WCHAR_KIND
PyUnicode_InternImmortal()
已移除¶
PyFrame_BlockSetup()
和PyFrame_BlockPop()
已被移除。(由 Mark Shannon 在 bpo-40222 中貢獻。)移除以下使用
errno
變數的數學宏Py_ADJUST_ERANGE1()
Py_ADJUST_ERANGE2()
Py_OVERFLOWED()
Py_SET_ERANGE_IF_OVERFLOW()
Py_SET_ERRNO_ON_MATH_ERROR()
(由 Victor Stinner 在 bpo-45412 中貢獻。)
移除
Py_UNICODE_COPY()
和Py_UNICODE_FILL()
宏,它們自 Python 3.3 起已被棄用。請改用PyUnicode_CopyCharacters()
或memcpy()
(wchar_t*
字串),以及PyUnicode_Fill()
函式。(由 Victor Stinner 在 bpo-41123 中貢獻。)移除
pystrhex.h
標頭檔案。它只包含私有函式。C 擴充套件只應包含主要的<Python.h>
標頭檔案。(由 Victor Stinner 在 bpo-45434 中貢獻。)移除
Py_FORCE_DOUBLE()
宏。它曾被Py_IS_INFINITY()
宏使用。(由 Victor Stinner 在 bpo-45440 中貢獻。)當
Py_LIMITED_API
定義時,以下專案不再可用Py_MARSHAL_VERSION
宏
這些不屬於 受限 API。
(由 Victor Stinner 在 bpo-45474 中貢獻。)
從受限 C API 中排除
PyWeakref_GET_OBJECT()
。它從未起作用,因為PyWeakReference
結構在受限 C API 中是不透明的。(由 Victor Stinner 在 bpo-35134 中貢獻。)移除
PyHeapType_GET_MEMBERS()
宏。它因錯誤地暴露在公共 C API 中,它只能在 Python 內部使用。請改用PyTypeObject.tp_members
成員。(由 Victor Stinner 在 bpo-40170 中貢獻。)移除
HAVE_PY_SET_53BIT_PRECISION
宏(已移至內部 C API)。(由 Victor Stinner 在 bpo-45412 中貢獻。)
移除
Py_UNICODE
編碼器 API,因為它們自 Python 3.3 起已被棄用,使用較少且相對於推薦的替代方案效率低下。已移除的函式有:
PyUnicode_Encode()
PyUnicode_EncodeASCII()
PyUnicode_EncodeLatin1()
PyUnicode_EncodeUTF7()
PyUnicode_EncodeUTF8()
PyUnicode_EncodeUTF16()
PyUnicode_EncodeUTF32()
PyUnicode_EncodeUnicodeEscape()
PyUnicode_EncodeRawUnicodeEscape()
PyUnicode_EncodeCharmap()
PyUnicode_TranslateCharmap()
PyUnicode_EncodeDecimal()
PyUnicode_TransformDecimalToASCII()
3.11.4 中的顯著更改¶
tarfile¶
tarfile
中的提取方法和shutil.unpack_archive()
現在有一個新的 filter 引數,允許限制 tar 功能,這些功能可能令人意外或危險,例如在目標目錄之外建立檔案。有關詳細資訊,請參閱 提取過濾器。在 Python 3.12 中,不帶 filter 引數的使用將顯示DeprecationWarning
。在 Python 3.14 中,預設值將切換為'data'
。(由 Petr Viktorin 在 PEP 706 中貢獻。)
3.11.5 中的顯著更改¶
OpenSSL¶
python.org 提供的 Windows 構建和 macOS 安裝程式現在使用 OpenSSL 3.0。