回溯中增強(qiáng)的錯誤位置
打印回溯時,解釋器現(xiàn)在將指向?qū)е洛e誤的確切表達(dá)式,而不僅僅是行。例如:
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)用時,這些增強(qiáng)的錯誤也很有幫助,
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ù)表達(dá)式:
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)存使用量略有增加。為了避免存儲額外信息和/或停用打印額外回溯信息, 命令行標(biāo)志或-X no_debug_rangesPYTHONNODEBUGRANGES 可以使用環(huán)境變量。
代碼對象的列信息
增強(qiáng)回溯功能使用的信息作為通用 API 提供,可用于將字節(jié)碼指令與源代碼相關(guān)聯(lián)。可以使用以下方法檢索此信息:
選項(xiàng)和環(huán)境變量 -X no_debug_rangesPYTHONNODEBUGRANGES可用于禁用此功能。
看PEP 657了解更多詳情。(由 Pablo Galindo、Batuhan Taskaya 和 Ammar Askar 在bpo-43950中貢獻(xiàn)。)
異??梢杂米址S富__note__
該__note__字段已添加到BaseException. 默認(rèn)情況None 下,但可以設(shè)置為添加到異?;厮莸淖址?。(由 Irit Katriel 在bpo-45607中貢獻(xiàn)。)
其他語言變化
其他 CPython 實(shí)現(xiàn)更改
- 特殊方法complex.__complex__()和bytes.__bytes__()實(shí)現(xiàn)支持typing.SupportsComplex和typing.SupportsBytes協(xié)議。(由
Mark Dickinson 和 Dong-hee Na 在bpo-24234中貢獻(xiàn)。)
- siphash13被添加為新的內(nèi)部散列算法。它具有類似的安全屬性,siphash24但對于長輸入來說它稍快一些。str,bytes和其他一些類型現(xiàn)在使用它作為hash().PEP 552 基于散列的 pyc 文件現(xiàn)在siphash13也使用 . (由 Inada Naoki 在bpo-29410中貢獻(xiàn)。)
- 當(dāng)不帶參數(shù)的語句重新引發(fā)活動異常時raise,附加到此異常的回溯現(xiàn)在始終為sys.exc_info()[1].__traceback__. 這意味著對當(dāng)前except子句中的回溯所做的更改會反映在重新引發(fā)的異常中。(由
Irit Katriel 在bpo-45711中貢獻(xiàn)。)
- 解釋器狀態(tài)表示的已處理異常(又名 exc_info 或 _PyErr_StackItem)現(xiàn)在只有該exc_value字段,exc_type并且exc_traceback 已被刪除,因?yàn)樗鼈兊闹悼梢詮膃xc_value. (由 Irit Katriel 在bpo-45711中貢獻(xiàn)。)
- 為 Windows 安裝程序AppendPath添加了一個新的命令行選項(xiàng)。它的行為類似于PrependPath但附加了 install 和 scripts 目錄,而不是前面。(由 Bastian Neuburger 在bpo-44934中貢獻(xiàn)。)
新模塊
改進(jìn)的模塊
fractions
空閑和空閑庫
- 對.pyi文件應(yīng)用語法高亮。(由 Alex Waygood 和 Terry Jan Reedy 在bpo-45447中貢獻(xiàn)。)
inspect
math
operator
- 添加了一個新功能operator.call,例如 . (由 Antony Lee 在bpo-44019中貢獻(xiàn)。)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中貢獻(xiàn)。)
sqlite3
sys
- sys.exc_info()現(xiàn)在從(異常實(shí)例)派生typeandtraceback字段value,因此當(dāng)異常在處理過程中被修改時,更改會反映在對 . 的后續(xù)調(diào)用的結(jié)果中exc_info()。(由 Irit Katriel 在bpo-45711中貢獻(xiàn)。)
- 添加sys.exception()返回活動異常實(shí)例(相當(dāng)于sys.exc_info()[1])。(由 Irit Katriel 在bpo-46328中貢獻(xiàn)。)
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中貢獻(xiàn)。)
- 在 Windows 8.1 和更新版本上,time.sleep()現(xiàn)在使用基于高分辨率計(jì)時器的可等待計(jì)時器 ,其分辨率為 100 納秒(10
-7秒)。以前,它的分辨率為 1 毫秒(10 -3秒)。(由 Benjamin Sz?ke、Dong-hee Na、Eryk Sun 和 Victor Stinner 在bpo-21302和bpo-45429 中貢獻(xiàn)。)
unicodedata
- Unicode 數(shù)據(jù)庫已更新至版本 14.0.0。( bpo-45190 )。
fcntl
- 在 FreeBSD 上,F(xiàn)_DUP2FD和F_DUP2FD_CLOEXECflags 分別被支持,前者相當(dāng)于dup2使用,后者FD_CLOEXEC額外設(shè)置了 flag。
Optimizations
- 編譯器現(xiàn)在使用僅包含格式代碼的文字格式優(yōu)化簡單的 C 樣式格式%s,%r并%a使其與相應(yīng)的 f 字符串表達(dá)式一樣快。(由 Serhiy Storchaka 在bpo-28307中貢獻(xiàn)。)
- 實(shí)施“零成本”例外。try當(dāng)不引發(fā)異常時,語句的成本幾乎可以消除。(由 Mark Shannon 在bpo-40222中貢獻(xiàn)。)
- 由于避免創(chuàng)建綁定方法實(shí)例的字節(jié)碼更改,現(xiàn)在使用關(guān)鍵字的方法調(diào)用更快。以前,此優(yōu)化僅適用于具有純位置參數(shù)的方法調(diào)用。(由 Ken Jin 和 Mark Shannon 在bpo-26110中貢獻(xiàn),基于 PyPy 中實(shí)現(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中貢獻(xiàn)。)
- 當(dāng)所有插入的鍵都是 Unicode 對象時,字典不存儲哈希值。這減少了字典大小。例如,sys.getsizeof(dict.fromkeys("abcdefg")) 在 64 位平臺上從 352 字節(jié)變?yōu)?272 字節(jié)。(由 Inada Naoki 在bpo-46845中貢獻(xiàn)。)
CPython 字節(jié)碼更改
Deprecated
Removed
- smtpd.MailmanProxy現(xiàn)在已刪除,因?yàn)闆]有外部模塊就無法使用mailman. (由 Dong-hee Na 在bpo-35800中提供。)
- 該binhex模塊在 Python 3.9 中已棄用,現(xiàn)在已刪除。在 Python 3.9 中不推薦使用的以下binascii函數(shù)現(xiàn)在也被刪除:a2b_hqx(), b2a_hqx();rlecode_hqx(), rledecode_hqx().該binascii.crc_hqx()功能仍然可用。(由
Victor Stinner 在bpo-45085中貢獻(xiàn)。)
- bdist_msi在 Python 3.9 中不推薦使用的 distutils命令現(xiàn)在已被刪除。改用bdist_wheel(車輪包)。(由 Hugo van Kemenade 在bpo-45124中貢獻(xiàn)。)
- 由于重大的安全問題, Python 3.9 中禁用的 的reuse_address參數(shù) asyncio.loop.create_datagram_endpoint()現(xiàn)在已完全刪除。這是因?yàn)?SO_REUSEADDRUDP 中套接字選項(xiàng)的行為。(由 Hugo van
Kemenade 在bpo-45129中貢獻(xiàn)。)
- 自Python 3.9 起已不推薦使用和 的__getitem__()方法 。(由 Hugo van Kemenade 在bpo-45132中貢獻(xiàn)。)xml.dom.pulldom.DOMEventStream
wsgiref.util.FileWrapperfileinput.FileInput
- gettext 模塊中刪除了以下不推薦使用的函數(shù)和方法:lgettext()、ldgettext()和 。lngettext()``ldngettext()Function bind_textdomain_codeset()、 methods output_charset()和 set_output_charset()以及函數(shù)的codeset
參數(shù)translation()and install() 也被刪除,因?yàn)樗鼈儍H用于l*gettext()函數(shù)。(由 Dong-hee Na 和 Serhiy
Storchaka 在bpo-44235中貢獻(xiàn)。)
- 使基于生成器的舊協(xié)程與 async/await 代碼兼容的@asyncio.coroutine 裝飾器。該函數(shù)自 Python 3.8 起已被棄用,最初計(jì)劃在 Python 3.10 中刪除。改為使用。(由 Illia Volochii 在bpo-43216中貢獻(xiàn)。)
async def
- asyncio.coroutines.CoroWrapper用于在調(diào)試模式下包裝遺留的基于生成器的協(xié)程對象。(由 Illia Volochii 在bpo-43216中貢獻(xiàn)。)
- 刪除了已棄用split()的_tkinter.TkappType. (由 Erlend E. Aasland 在bpo-38371中貢獻(xiàn)。)
- 從inspect模塊中刪除:該getargspec函數(shù),自 Python 3.0 起已棄用;使用inspect.signature()orinspect.getfullargspec()代替。該formatargspec函數(shù),自
Python 3.5 起已棄用;直接使用inspect.signature()函數(shù)和Signature對象。自 Python 3.5 起已棄用的未記錄Signature.from_builtin和Signature.from_function 函數(shù);改用該 Signature.from_callable()方法。(由
Hugo van Kemenade 在bpo-45320中貢獻(xiàn)。)
- 從 unittest 發(fā)現(xiàn)中刪除命名空間包支持。它是在 Python 3.4 中引入的,但自 Python 3.7 以來已被破壞。(由 Inada Naoki 在bpo-23882中貢獻(xiàn)。)
- 從 中刪除__class_getitem__方法pathlib.PurePath,因?yàn)樵谝郧暗陌姹局袥]有使用和錯誤添加。(由 Nikita Sobolev 在bpo-46483中貢獻(xiàn)。)
- 刪除未記錄的私有方法,以前在 Python 3.7 中float.__set_format__()稱為。float.__setformat__()它的文檔字符串說:“你可能不想使用這個函數(shù)。它的存在主要是為了在 Python 的測試套件中使用?!?(由 Victor Stinner 在bpo-46852中貢獻(xiàn)。)
移植到 Python 3.11
本節(jié)列出了之前描述的更改和其他可能需要更改代碼的錯誤修正。
Python API 的變化
構(gòu)建更改
- 構(gòu)建 Python 現(xiàn)在需要一個沒有可選 C11 功能的 C11 編譯器。(由 Victor Stinner 在bpo-46656中貢獻(xiàn)。)
- 現(xiàn)在可以使用 ThinLTO 選項(xiàng)通過--with-lto=thin. (由 Dong-hee Na 和 Brett Holman 在bpo-44340中貢獻(xiàn)。)
- libpython 不再與 libcrypt 鏈接。(由 Mike Gilbert 在bpo-45433中貢獻(xiàn)。)
- 構(gòu)建 Python 現(xiàn)在需要一個<math.h>提供以下函數(shù)的 C99 頭文件:copysign(), hypot(), isfinite(), isinf(), isnan(), round(). (由 Victor Stinner 在bpo-45440中貢獻(xiàn)。)
- 構(gòu)建 Python 現(xiàn)在需要一個<math.h>提供NAN常量或__builtin_nan()內(nèi)置函數(shù)的 C99 頭文件。(由 Victor Stinner 在bpo-46640中貢獻(xiàn)。)
- 構(gòu)建 Python 現(xiàn)在需要支持浮點(diǎn)非數(shù)字 (NaN):刪除Py_NO_NAN宏。(由 Victor Stinner 在bpo-46656中貢獻(xiàn)。)
- 現(xiàn)在可以禁用對象結(jié)構(gòu)的空閑列表。一個新的配置 選項(xiàng)--without-freelists可用于禁用除空元組單例之外的所有空閑列表。(由 Christian Heimes 在bpo-45522中貢獻(xiàn))
- Modules/Setup并Modules/makesetup進(jìn)行了改進(jìn)和捆綁。擴(kuò)展模塊現(xiàn)在可以通過makesetup. 除了一些測試模塊之外的所有模塊都可以靜態(tài)鏈接到主二進(jìn)制文件或庫中。(由 Brett Cannon 和 Christian Heimes 在bpo-45548、 bpo-45570、
bpo-45571和bpo-43974 中貢獻(xiàn)。)
- configure現(xiàn)在可以檢測大多數(shù) stdlib 擴(kuò)展模塊的構(gòu)建依賴項(xiàng)、編譯器標(biāo)志和鏈接器標(biāo)志。libffi、libnsl、libsqlite3、zlib、bzip2、liblzma、libcrypt 和 uuid 標(biāo)志由 pkg-config(如果可用)檢測。(由 Christian Heimes 和 Erlend Egeberg Aasland 在 bpo-bpo-45847、 bpo-45747和
bpo-45763 中貢獻(xiàn)。)
- CPython 現(xiàn)在有對交叉編譯到 WebAssembly 平臺的實(shí)驗(yàn)性支持wasm32-emscripten。這項(xiàng)工作受到了 Pyodide 等先前工作的啟發(fā)。(由 Christian Heimes 和 Ethan Smith 在bpo-40280中貢獻(xiàn)。)
- CPython 現(xiàn)在將默認(rèn)使用 30 位數(shù)字來int 實(shí)現(xiàn) Python。以前,默認(rèn)是在帶有 的平臺上使用 30 位數(shù)字,否則使用 15 位數(shù)字。仍然可以通過配置腳本的選項(xiàng)或(對于 Windows)中的 變量顯式請求使用 15 位數(shù)字 ,但將來可能會刪除此選項(xiàng)。(由 Mark Dickinson 在 bpo-45569中貢獻(xiàn)。)SIZEOF_VOID_P
>= 8``--enable-big-digits``PYLONG_BITS_IN_DIGIT``PC/pyconfig.h
C API
- PyErr_SetExcInfo()不再使用typeand參數(shù),解釋器現(xiàn)在從異常實(shí)例(參數(shù))traceback 派生這些值。value該函數(shù)仍然竊取所有三個參數(shù)的引用。(由 Irit Katriel 在 bpo-45711中貢獻(xiàn)。)
- PyErr_GetExcInfo()現(xiàn)在 從異常實(shí)例(字段)派生結(jié)果的type和字段。(由 Irit Katriel 在bpo-45711中貢獻(xiàn)。)traceback``value
- _frozen有一個新is_package字段來指示凍結(jié)的模塊是否是一個包。以前,該字段中的負(fù)值size是指標(biāo)?,F(xiàn)在只有非負(fù)值用于size. (由 Kumar Aditya 在bpo-46608中貢獻(xiàn)。)
新功能
更多建議: