回溯中增強的錯誤位置
打印回溯時,解釋器現(xiàn)在將指向?qū)е洛e誤的確切表達式,而不僅僅是行。例如:
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。在處理深度嵌套的字典對象和多個函數(shù)調(diào)用時,這些增強的錯誤也很有幫助,
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
以及復(fù)雜的算術(shù)表達式:
Traceback (most recent call last):
File "calculation.py", line 54, in <module>
result = (x / y / z) * (a / b / c)
~~~~~~^~~
ZeroDivisionError: division by zero
此功能需要將列位置存儲在代碼對象中,這可能會導(dǎo)致編譯 Python 文件的磁盤使用量或解釋器內(nèi)存使用量略有增加。為了避免存儲額外信息和/或停用打印額外回溯信息, 命令行標志或-X no_debug_rangesPYTHONNODEBUGRANGES 可以使用環(huán)境變量。
代碼對象的列信息
增強回溯功能使用的信息作為通用 API 提供,可用于將字節(jié)碼指令與源代碼相關(guān)聯(lián)??梢允褂靡韵路椒z索此信息:
選項和環(huán)境變量 -X no_debug_rangesPYTHONNODEBUGRANGES可用于禁用此功能。
看PEP 657了解更多詳情。(由 Pablo Galindo、Batuhan Taskaya 和 Ammar Askar 在bpo-43950中貢獻。)
異常可以用字符串豐富__note__
該__note__字段已添加到BaseException. 默認情況None 下,但可以設(shè)置為添加到異常回溯的字符串。(由 Irit Katriel 在bpo-45607中貢獻。)
其他語言變化
其他 CPython 實現(xiàn)更改
- 特殊方法complex.__complex__()和bytes.__bytes__()實現(xiàn)支持typing.SupportsComplex和typing.SupportsBytes協(xié)議。(由
Mark Dickinson 和 Dong-hee Na 在bpo-24234中貢獻。)
- siphash13被添加為新的內(nèi)部散列算法。它具有類似的安全屬性,siphash24但對于長輸入來說它稍快一些。str,bytes和其他一些類型現(xiàn)在使用它作為hash().PEP 552 基于散列的 pyc 文件現(xiàn)在siphash13也使用 . (由 Inada Naoki 在bpo-29410中貢獻。)
- 當不帶參數(shù)的語句重新引發(fā)活動異常時raise,附加到此異常的回溯現(xiàn)在始終為sys.exc_info()[1].__traceback__. 這意味著對當前except子句中的回溯所做的更改會反映在重新引發(fā)的異常中。(由
Irit Katriel 在bpo-45711中貢獻。)
- 解釋器狀態(tài)表示的已處理異常(又名 exc_info 或 _PyErr_StackItem)現(xiàn)在只有該exc_value字段,exc_type并且exc_traceback 已被刪除,因為它們的值可以從exc_value. (由 Irit Katriel 在bpo-45711中貢獻。)
- 為 Windows 安裝程序AppendPath添加了一個新的命令行選項。它的行為類似于PrependPath但附加了 install 和 scripts 目錄,而不是前面。(由 Bastian Neuburger 在bpo-44934中貢獻。)
新模塊
改進的模塊
fractions
空閑和空閑庫
- 對.pyi文件應(yīng)用語法高亮。(由 Alex Waygood 和 Terry Jan Reedy 在bpo-45447中貢獻。)
inspect
math
operator
- 添加了一個新功能operator.call,例如 . (由 Antony Lee 在bpo-44019中貢獻。)operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)
os
- 在 Windows 上,os.urandom()現(xiàn)在使用BCryptGenRandom(),而不是CryptGenRandom()已棄用。(由 Dong-hee Na 在bpo-44611中提供。)
socket
- 添加對 NetBSD 的 CAN Socket 支持。(由 Thomas Klausner 在bpo-30512中貢獻。)
sqlite3
sys
threading
time
- 在 Unix 上,time.sleep()現(xiàn)在使用clock_nanosleep()or nanosleep()函數(shù)(如果可用),其分辨率為 1 納秒(10 -9秒),而不是使用select()其分辨率為 1 微秒(10 -6秒)。(由 Benjamin Sz?ke 和 Victor Stinner 在bpo-21302中貢獻。)
- 在 Windows 8.1 和更新版本上,time.sleep()現(xiàn)在使用基于高分辨率計時器的可等待計時器 ,其分辨率為 100 納秒(10
-7秒)。以前,它的分辨率為 1 毫秒(10 -3秒)。(由 Benjamin Sz?ke、Dong-hee Na、Eryk Sun 和 Victor Stinner 在bpo-21302和bpo-45429 中貢獻。)
unicodedata
- Unicode 數(shù)據(jù)庫已更新至版本 14.0.0。( bpo-45190 )。
fcntl
- 在 FreeBSD 上,F(xiàn)_DUP2FD和F_DUP2FD_CLOEXECflags 分別被支持,前者相當于dup2使用,后者FD_CLOEXEC額外設(shè)置了 flag。
Optimizations
- 編譯器現(xiàn)在使用僅包含格式代碼的文字格式優(yōu)化簡單的 C 樣式格式%s,%r并%a使其與相應(yīng)的 f 字符串表達式一樣快。(由 Serhiy Storchaka 在bpo-28307中貢獻。)
- 實施“零成本”例外。try當不引發(fā)異常時,語句的成本幾乎可以消除。(由 Mark Shannon 在bpo-40222中貢獻。)
- 由于避免創(chuàng)建綁定方法實例的字節(jié)碼更改,現(xiàn)在使用關(guān)鍵字的方法調(diào)用更快。以前,此優(yōu)化僅適用于具有純位置參數(shù)的方法調(diào)用。(由 Ken Jin 和 Mark Shannon 在bpo-26110中貢獻,基于 PyPy 中實現(xiàn)的想法。)
- 純 ASCII 字符串現(xiàn)在在常數(shù)時間內(nèi)通過unicodedata.normalize(). (由 Dong-hee Na 在bpo-44987中提供。)
- math函數(shù)comb(),perm()現(xiàn)在對于大參數(shù)來說速度提高了
10 倍或更多(對于較大的k速度更快)。(由 Serhiy Storchaka 在bpo-37295中貢獻。)
- 當所有插入的鍵都是 Unicode 對象時,字典不存儲哈希值。這減少了字典大小。例如,sys.getsizeof(dict.fromkeys("abcdefg")) 在 64 位平臺上從 352 字節(jié)變?yōu)?272 字節(jié)。(由 Inada Naoki 在bpo-46845中貢獻。)
CPython 字節(jié)碼更改
Deprecated
Removed
移植到 Python 3.11
本節(jié)列出了之前描述的更改和其他可能需要更改代碼的錯誤修正。
Python API 的變化
構(gòu)建更改
- 構(gòu)建 Python 現(xiàn)在需要一個沒有可選 C11 功能的 C11 編譯器。(由 Victor Stinner 在bpo-46656中貢獻。)
- 現(xiàn)在可以使用 ThinLTO 選項通過--with-lto=thin. (由 Dong-hee Na 和 Brett Holman 在bpo-44340中貢獻。)
- libpython 不再與 libcrypt 鏈接。(由 Mike Gilbert 在bpo-45433中貢獻。)
- 構(gòu)建 Python 現(xiàn)在需要一個<math.h>提供以下函數(shù)的 C99 頭文件:copysign(), hypot(), isfinite(), isinf(), isnan(), round(). (由 Victor Stinner 在bpo-45440中貢獻。)
- 構(gòu)建 Python 現(xiàn)在需要一個<math.h>提供NAN常量或__builtin_nan()內(nèi)置函數(shù)的 C99 頭文件。(由 Victor Stinner 在bpo-46640中貢獻。)
- 構(gòu)建 Python 現(xiàn)在需要支持浮點非數(shù)字 (NaN):刪除Py_NO_NAN宏。(由 Victor Stinner 在bpo-46656中貢獻。)
- 現(xiàn)在可以禁用對象結(jié)構(gòu)的空閑列表。一個新的配置 選項--without-freelists可用于禁用除空元組單例之外的所有空閑列表。(由 Christian Heimes 在bpo-45522中貢獻)
- Modules/Setup并Modules/makesetup進行了改進和捆綁。擴展模塊現(xiàn)在可以通過makesetup. 除了一些測試模塊之外的所有模塊都可以靜態(tài)鏈接到主二進制文件或庫中。(由 Brett Cannon 和 Christian Heimes 在bpo-45548、 bpo-45570、
bpo-45571和bpo-43974 中貢獻。)
- configure現(xiàn)在可以檢測大多數(shù) stdlib 擴展模塊的構(gòu)建依賴項、編譯器標志和鏈接器標志。libffi、libnsl、libsqlite3、zlib、bzip2、liblzma、libcrypt 和 uuid 標志由 pkg-config(如果可用)檢測。(由 Christian Heimes 和 Erlend Egeberg Aasland 在 bpo-bpo-45847、 bpo-45747和
bpo-45763 中貢獻。)
- CPython 現(xiàn)在有對交叉編譯到 WebAssembly 平臺的實驗性支持wasm32-emscripten。這項工作受到了 Pyodide 等先前工作的啟發(fā)。(由 Christian Heimes 和 Ethan Smith 在bpo-40280中貢獻。)
- CPython 現(xiàn)在將默認使用 30 位數(shù)字來int 實現(xiàn) Python。以前,默認是在帶有 的平臺上使用 30 位數(shù)字,否則使用 15 位數(shù)字。仍然可以通過配置腳本的選項或(對于 Windows)中的 變量顯式請求使用 15 位數(shù)字 ,但將來可能會刪除此選項。(由 Mark Dickinson 在 bpo-45569中貢獻。)SIZEOF_VOID_P
>= 8``--enable-big-digits``PYLONG_BITS_IN_DIGIT``PC/pyconfig.h
C API
- PyErr_SetExcInfo()不再使用typeand參數(shù),解釋器現(xiàn)在從異常實例(參數(shù))traceback 派生這些值。value該函數(shù)仍然竊取所有三個參數(shù)的引用。(由 Irit Katriel 在 bpo-45711中貢獻。)
- PyErr_GetExcInfo()現(xiàn)在 從異常實例(字段)派生結(jié)果的type和字段。(由 Irit Katriel 在bpo-45711中貢獻。)traceback``value
- _frozen有一個新is_package字段來指示凍結(jié)的模塊是否是一個包。以前,該字段中的負值size是指標?,F(xiàn)在只有非負值用于size. (由 Kumar Aditya 在bpo-46608中貢獻。)
新功能
更多建議: