Python3.11更新

2022-03-04 11:18 更新

回溯中增強的錯誤位置

打印回溯時,解釋器現(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

以及復雜的算術(shù)表達式:

Traceback (most recent call last):
File "calculation.py", line 54, in <module>
  result = (x / y / z) * (a / b / c)
            ~~~~~~^~~
ZeroDivisionError: division by zero

此功能需要將列位置存儲在代碼對象中,這可能會導致編譯 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中貢獻。)

異??梢杂米址S富__note__

該__note__字段已添加到BaseException. 默認情況None 下,但可以設(shè)置為添加到異?;厮莸淖址#ㄓ?Irit Katriel 在bpo-45607中貢獻。)

其他語言變化

其他 CPython 實現(xiàn)更改

  • 特殊方法complex.__complex__()和bytes.__bytes__()實現(xiàn)支持typing.SupportsComplextyping.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

  • 支持PEP 515Fraction -從字符串初始化(由 Sergey B Kirpichev 在bpo-44258中貢獻。)
  • Fraction現(xiàn)在實現(xiàn)一個__int__方法,以便檢查通過。(由 Mark Dickinson 在bpo-44547中貢獻。)isinstance(some_fraction, typing.SupportsInt)

空閑和空閑庫

  • 對.pyi文件應(yīng)用語法高亮。(由 Alex Waygood 和 Terry Jan Reedy 在bpo-45447中貢獻。)

inspect

math

  • math.exp2():返回 2 的 x 次方。(由 Gideon Mitchell 在bpo-45917中貢獻。)
  • 添加math.cbrt():返回 x 的立方根。(由 Ajith Ramachandran 在bpo-44357中貢獻。)
  • math.pow()為了與 IEEE 754 規(guī)范保持一致,更改了兩個極端情況的行為。操作 ,現(xiàn)在返回 。以前他們提出了. (由 Mark Dickinson 在bpo-44339中貢獻。)math.pow(0.0, -math.inf)``math.pow(-0.0, -math.inf)``inf ValueError

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

  • sys.exc_info()現(xiàn)在從(異常實例)派生typeandtraceback字段value,因此當異常在處理過程中被修改時,更改會反映在對 . 的后續(xù)調(diào)用的結(jié)果中exc_info()。(由 Irit Katriel 在bpo-45711中貢獻。)
  • 添加sys.exception()返回活動異常實例(相當于sys.exc_info()[1])。(由 Irit Katriel 在bpo-46328中貢獻。)

threading

  • 在 Unix 上,如果該sem_clockwait()函數(shù)在 C 庫(glibc 2.30 和更新版本)中可用,則該threading.Lock.acquire()方法現(xiàn)在使用單調(diào)時鐘 ( time.CLOCK_MONOTONIC) 進行超時,而不是使用系統(tǒng)時鐘 ( time.CLOCK_REALTIME),以不受系統(tǒng)時鐘更改的影響。(由 Victor Stinner 在bpo-41710中貢獻。)

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-21302bpo-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é)碼更改

  • 用單個 實現(xiàn)替換了所有數(shù)字BINARY_*和指令。INPLACE_*BINARY_OP
  • 將三個調(diào)用指令:CALL_FUNCTION和 CALL_FUNCTION_KW替換CALL_METHOD為 PUSH_NULL、PRECALL、 CALL KW_NAMES。這將方法的參數(shù)轉(zhuǎn)移與關(guān)鍵字參數(shù)的處理分離,并允許更好地專門化調(diào)用。
  • 刪除COPY_DICT_WITHOUT_KEYS和GEN_START。
  • MATCH_CLASS并且MATCH_KEYS不再推送一個額外的布爾值來指示匹配是成功還是失敗。相反,它們指示失敗 None (否則提取值的元組會出現(xiàn))。
  • 用 new 和指令替換幾個堆棧操作指令(DUP_TOP、DUP_TOP_TWO、 ROT_TWO、ROT_THREE、ROT_FOUR和) 。ROT_NCOPY SWAP
  • 添加POP_JUMP_IF_NOT_NONEPOP_JUMP_IF_NONE操作碼以加速條件跳轉(zhuǎn)。
  • JUMP_IF_NOT_EXC_MATCH不再彈出活動異常。

Deprecated

  • lib2to3包和2to3工具現(xiàn)已棄用,可能無法解析 Python 3.10 或更高版本。見PEP 617(CPython 的新 PEG 解析器)。(由 Victor Stinner 在bpo-40360中貢獻。)
  • webbrowser.MacOSX已棄用并將在 Python 3.13 中刪除。它未經(jīng)測試和未記錄,也沒有被 webbrowser 本身使用。(由 Dong-hee Na 在bpo-42255中提供。)
  • 從 aTestCaseIsolatedAsyncioTestCasetest 方法返回值的行為(默認None值除外)現(xiàn)在已棄用。
  • 已棄用以下unittest函數(shù),計劃在 Python 3.13 中刪除:unittest.findTestCases()unittest.makeSuite()unittest.getTestCaseNames()改用TestLoader方法: unittest.TestLoader.loadTestsFromModule()unittest.TestLoader.loadTestsFromTestCase()unittest.TestLoader.getTestCaseNames()(由 Erlend E. Aasland 在bpo-5846中貢獻。)
  • 自turtle.RawTurtle.settiltangle()Python 3.1 起已棄用,現(xiàn)在它會發(fā)出棄用警告,并將在 Python 3.13 中刪除。改為使用 turtle.RawTurtle.tiltangle()(它之前被錯誤地標記為已棄用,現(xiàn)在更正了它的文檔字符串)。(由 Hugo van Kemenade 在bpo-45837中貢獻。)
  • int()to的委托__trunc__()現(xiàn)在已被棄用。調(diào)用 int(a)何時type(a)實現(xiàn)__trunc__()但未 實現(xiàn)__int__()或__index__()現(xiàn)在會引發(fā) DeprecationWarning . (由 Zackery Spytz 在bpo-44977中貢獻。)
  • configparser自 Python 3.2 起,以下內(nèi)容已被棄用。他們的棄用警告現(xiàn)在已經(jīng)更新,注意他們將在 Python 3.12 中刪除:configparser.SafeConfigParser班級_configparser.ParsingError.filename財產(chǎn)_configparser.ParsingError.readfp()方法_(由 Hugo van Kemenade 在bpo-45173中貢獻。)
  • locale.getdefaultlocale()函數(shù)已棄用,將在 Python 3.13 中刪除。改用locale.setlocale(), locale.getpreferredencoding(False)locale.getlocale()函數(shù)。(由 Victor Stinner 在bpo-46659中貢獻。)

Removed

  • smtpd.MailmanProxy現(xià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中貢獻。)
  • bdist_msi在 Python 3.9 中不推薦使用的 distutils命令現(xiàn)在已被刪除。改用bdist_wheel(車輪包)。(由 Hugo van Kemenade 在bpo-45124中貢獻。)
  • 由于重大的安全問題, Python 3.9 中禁用的 的reuse_address參數(shù) asyncio.loop.create_datagram_endpoint()現(xiàn)在已完全刪除。這是因為 SO_REUSEADDRUDP 中套接字選項的行為。(由 Hugo van Kemenade 在bpo-45129中貢獻。)
  • 自Python 3.9 起已不推薦使用和 的__getitem__()方法 。(由 Hugo van Kemenade 在bpo-45132中貢獻。)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() 也被刪除,因為它們僅用于l*gettext()函數(shù)。(由 Dong-hee Na 和 Serhiy Storchaka 在bpo-44235中貢獻。)
  • 使基于生成器的舊協(xié)程與 async/await 代碼兼容的@asyncio.coroutine 裝飾器。該函數(shù)自 Python 3.8 起已被棄用,最初計劃在 Python 3.10 中刪除。改為使用。(由 Illia Volochii 在bpo-43216中貢獻。) async def
  • asyncio.coroutines.CoroWrapper用于在調(diào)試模式下包裝遺留的基于生成器的協(xié)程對象。(由 Illia Volochii 在bpo-43216中貢獻。)
  • 刪除了已棄用split()的_tkinter.TkappType. (由 Erlend E. Aasland 在bpo-38371中貢獻。)
  • 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中貢獻。)
  • 從 unittest 發(fā)現(xiàn)中刪除命名空間包支持。它是在 Python 3.4 中引入的,但自 Python 3.7 以來已被破壞。(由 Inada Naoki 在bpo-23882中貢獻。)
  • 從 中刪除__class_getitem__方法pathlib.PurePath,因為在以前的版本中沒有使用和錯誤添加。(由 Nikita Sobolev 在bpo-46483中貢獻。)
  • 刪除未記錄的私有方法,以前在 Python 3.7 中float.__set_format__()稱為。float.__setformat__()它的文檔字符串說:“你可能不想使用這個函數(shù)。它的存在主要是為了在 Python 的測試套件中使用?!?(由 Victor Stinner 在bpo-46852中貢獻。)

移植到 Python 3.11

本節(jié)列出了之前描述的更改和其他可能需要更改代碼的錯誤修正。

Python API 的變化

  • 禁止傳遞非concurrent.futures.ThreadPoolExecutor 執(zhí)行者loop.set_default_executor()遵循 Python 3.8 中的棄用。(由 Illia Volochii 在bpo- 43234 中貢獻。)
  • open(), io.open(),codecs.open()并且 在文件模式下fileinput.FileInput不再接受'U'(“通用換行符”)。此標志自 Python 3.3 起已棄用。在 Python 3 中,當文件以文本模式打開時,默認使用“通用換行符”。的 換行參數(shù) open()控制通用換行的工作方式。(由 Victor Stinner 在bpo-37330中貢獻。)
  • pdb模塊現(xiàn)在讀取帶有編碼的.pdbrc配置文件。'utf-8'(由Srinivas Reddy oparthy(銇銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈銈......
  • 使用元組作為鍵進行排序時,如果元組元素未定義總排序,則結(jié)果的順序可能與早期版本不同(有關(guān)總排序的信息,請參閱值比較值)。在沒有對列表元素進行總排序的情況下,排序結(jié)果并沒有很好地定義,這通常是正確的。
  • calendar:如果未指定語言環(huán)境,則calendar.LocaleTextCalendarand calendar.LocaleHTMLCalendar 類現(xiàn)在使用 locale.getlocale(),而不是 using 。locale.getdefaultlocale()(由 Victor Stinner 在bpo-46659中貢獻。)

構(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-45571bpo-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-45747bpo-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中貢獻。)

新功能



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號