python3.8 新特性


https://docs.python.org/3.8/whatsnew/3.8.html

python 3.8的新功能
本文解釋了與3.7相比,python 3.8中的新特性。

有關完整的詳細信息,請參閱變更日志。

注意:預發布用戶應注意,此文檔當前處於草稿形式。隨着python 3.8向發行版邁進,它將得到實質性的更新,所以即使在閱讀了早期版本之后,也值得檢查一下。
總結-發布亮點
新特點
編譯字節碼文件的並行文件系統緩存
新的pythonpycacheprefix設置(也可用作-x pycache_prefix)將隱式字節碼緩存配置為使用單獨的並行文件系統樹,而不是每個源目錄中的默認子目錄。

緩存的位置以sys.pycache_前綴報告(none表示子目錄中的默認位置)。

(由Carl Meyer在BPO-33499中提供。)

其他語言更改
由於實現有問題,Continue語句在finally子句中是非法的。在python 3.8中,這個限制被解除了。(由Serhiy Storchaka在BPO-32489中提供。)

int類型現在有了一個新的as_integer_ratio()方法,與現有float.as_integer_ratio()方法兼容。(由Lisa Roach在BPO-33073中提供。)

添加了對正則表達式中\n name轉義的支持。(喬納森·尤尼斯和塞爾希·斯托查卡在BPO-30688中作了貢獻。)

dict和dictView現在可以使用reversed()按相反的插入順序進行迭代。(由R_mi Lapeyre在BPO-33462中提供。)

函數調用中關鍵字名稱所允許的語法受到了進一步的限制。特別是,不再允許使用f((關鍵字)=arg。它從來沒有打算允許在關鍵字參數賦值項的左側使用一個以上的裸名稱。見BPO-34 464。

現在允許在yield和return語句中不帶括號的iterable解包。(大衛·卡斯伯特和約旦·查普曼在BPO-32117中作了貢獻。)

反斜杠字符對不是有效的轉義序列,會生成自Python3.6以來的DeprecationWarning。在Python3.8中,它生成一個語法警告。(由Serhiy Storchaka在BPO-32912中提供。)

在某些情況下,當元組或列表前面缺少逗號時,編譯器現在會生成語法警告。例如:

數據=
(1,2,3)噢,缺少逗號!
(4, 5, 6)
]
(由Serhiy Storchaka在BPO-15248中提供。)

datetime.date或datetime.datetime子類與datetime.timedelta對象之間的算術運算現在返回子類的實例,而不是基類。這還影響其實現(直接或間接)使用datetime.timeDelta算法(如datetime.datetime.astimeZone())的操作的返回類型。(保羅甘斯勒在BPO-32417中作了貢獻。)

新模塊
還沒有。
改進的模塊
collections.namedtuple()的_asdict()方法現在返回dict,而不是collections.ordereddict。這是因為自Python3.7以來,常規的dict已經保證了排序。如果需要ordereddict的額外功能,建議的補救措施是將結果強制轉換為所需的類型:ordereddict(nt.\u asdict())。(由Raymond Hettinger在BPO-35864中提供。)
阿辛喬
在Windows上,默認的事件循環現在是ProactiveEventLoop。

獲得文本
添加了pgetext()及其變體。(由Franz Glasner、Ric Araujo和Cheryl Sabella在BPO-2504中提供。)

GZIP
將mtime參數添加到gzip.compress()以獲得可復制的輸出。(郭慈濤在BPO-34898中撰文)

idlelib和idle
N行上的輸出(默認為50)被壓縮為一個按鈕。n可以在設置對話框的常規頁面的pyshell部分更改。用鼠標右鍵單擊輸出可以壓縮的行更少,但也可能更長。通過雙擊按鈕或右鍵單擊按鈕進入剪貼板或單獨的窗口,可以就地擴展壓縮輸出。(Tal Einat在BPO-1529353中作了貢獻。)

以上更改已返回到3.7維護版本。

JSON工具
添加選項--json行,將每個輸入行解析為單獨的json對象。(韋鵬洪在BPO-31553中作了貢獻。)

數學
增加了新的函數math.dist(),用於計算兩點之間的歐幾里得距離。(由Raymond Hettinger在BPO-33089中提供。)

擴展了math.hypot()函數以處理多個維度。以前,它只支持二維案例。(由Raymond Hettinger在BPO-33089中提供。)

添加了新函數math.prod()作為sum()的類似函數,sum()返回“start”值(默認值:1)乘以可數的乘積。(由Pablo Galindo在BPO-35606中提供)

OS.PATH
返回exists()、lexists()、isdir()、isfile()、islink()和ismount()等布爾結果的os.path函數現在返回false,而不是為OS級別上包含不可顯示字符或字節的路徑引發valueerror或其子類unicodeencodeerror和unicodedecodeerror。(由Serhiy Storchaka在BPO-33721中提供。)

納克西斯
為基礎ncurses庫添加了一個保存結構化版本信息的新變量:ncurses_version。(由Serhiy Storchaka在BPO-31680中提供。)

小路
返回布爾結果的pathlib.path方法,如exists()、is_dir()、is_file()、is_mount()、is_symlink()、is_block_device()、is_char_device()、is_fifo()、is_socket()現在返回false,而不是為OS級別上包含不可顯示字符的路徑引發valueerror或其子類unicodeencodeerror。(由Serhiy Storchaka在BPO-33721中提供。)

舒蒂爾
copytree()現在接受一個新的dirs-exist-ok關鍵字參數。(喬希·布朗森在BPO-20849中作了貢獻。)

SSL
添加sslcontext.post_握手_auth以啟用和ssl.sslsocket.verify_client_post_握手()以啟動tls 1.3握手后身份驗證。(由Christian Heimes在BPO-34670中提供。)

令牌化
標記化模塊現在隱式地在提供沒有尾隨新行的輸入時發出新行標記。這種行為現在與C記號賦予器在內部所做的相匹配。(由安馬爾·阿斯卡爾在BPO-33899中提供。)

特金特
在tkinter.spinbox類中添加了方法selection_from()、selection_present()、selection_range()和selection_to()。(朱麗葉·蒙塞爾在BPO-34829中作了貢獻。)

在tkinter.canvas類中添加了方法moveto()。(由Juliette Monsel在BPO-23831中提供。)

時間
為MacOS 10.12增加了新的時鍾運行時間。(由Joannah Nanjekye在BPO-35702中提供。)

單播數據
新函數is_normalized()可用於驗證字符串是否為特定的正常形式。(由Max Belanger和David Eurest在BPO-32285中提供)。
單元測試
將AddModuleCleanup()和AddClassCleanup()添加到UnitTest,以支持對SetupModule()和SetupClass()的清理。(由Lisa Roach在BPO-24412中提供。)
靜脈注射
venv現在在所有平台上都包含一個activate.ps1腳本,用於在PowerShell Core 6.1下激活虛擬環境。(由BPO-32718中的布雷特·坎農提供。)
XML
作為對DTD和外部實體檢索的緩解措施,默認情況下,xml.dom.minidom和xml.sax模塊不再處理外部實體。(由Christian Heimes在BPO-17239中提供。)
優化
子進程模塊現在可以在某些情況下使用os.posix_spawn()函數以獲得更好的性能。目前,只有在滿足所有這些條件的情況下,它才用於MacOS和Linux(使用glibc 2.24或更高版本):
關閉錯誤;
prexec_fn、pass_fds、cwd和start_new_session參數未設置;
可執行路徑包含一個目錄。
shutil.copy file()、shutil.copy()、shutil.copy2()、shutil.copytree()和shutil.move()在Linux、MacOS和Solaris上使用平台特定的“快速復制”系統調用,以便更高效地復制文件。“快速復制”是指復制操作發生在內核中,避免在python中使用用戶空間緩沖區,如“outdd.write(infd.read())”。在Windows Shutil.copyFile()上使用更大的默認緩沖區大小(1 mib而不是16 kib),並使用基於memoryView()的Shutil.copyFileObj()變體。在同一個分區中復制512 mib文件的速度在Linux上約為+26%,在MacOS上為+50%,在Windows上為+40%。此外,CPU周期消耗更少。請參閱平台相關的高效復制操作部分。(由Giampaolo Rodola在BPO-33671中提供。)
copytree()使用os.scandir()函數,所有復制函數都使用緩存的os.stat()值。復制包含8000個文件的目錄的速度在Linux上大約是+9%,在Windows上是+20%,在Windows SMB共享上是+30%。另外,os.stat()系統調用的數量減少了38%,使得shutil.copytree()在網絡文件系統上的速度更快。(由Giampaolo Rodola在BPO-33695中提供。)
pickle模塊中的默認協議現在是協議4,首先在python 3.4中引入。與自Python3.0以來提供的協議3相比,它提供了更好的性能和更小的大小。

從Pygc頭上移除一個Py-ssize-t成員。所有GC跟蹤的對象(例如tuple、list、dict)的大小都減少了4或8個字節。(Inada Naoki在BPO-33597中提供)
uuid.uuid現在使用槽來減少內存占用。
operator.itemgetter()的性能提高了33%。優化了參數處理,並將單個非負整數索引的常見情況的快速路徑添加到元組中(這是標准庫中的典型用例)。(由Raymond Hettinger在BPO-35664中提供。)
加速collections.namedDuple()中的字段查找。它們現在的速度比以前快了兩倍多,這使得它們成為Python中最快的實例變量查找形式。(由Raymond Hettinger、Pablo Galindo和Serhiy Storchaka在BPO-32492中提供。)
如果輸入iterable的長度已知(輸入實現了len_uuuuuuuuuuuuuu),則列表構造函數不會過度分配內部項緩沖區。這使得創建的列表平均減少了12%。(由Raymond Hettinger和Pablo Galindo在BPO-33234中提供。)
構建和C API更改
pybytearray_init()和pybytearray_fini()函數已被刪除。自從python 2.7.4和python 3.2.0被排除在有限的api(穩定的abi)之外之后,它們什么也沒有做,也沒有被記錄下來。

pyexceptionclass_name()的結果現在是const char*類型,而不是char*類型。(由Serhiy Storchaka在BPO-33818中提供。)

模塊/setup.dist和模塊/設置的雙重性已被移除。以前,在更新cpython源樹時,必須手動將modules/setup.dist(在源樹中)復制到modules/setup(在構建樹中)以反映上游的任何更改。這對打包者來說是一個小的好處,但代價是在cpython開發之后開發人員經常遇到麻煩,因為忘記復制文件可能會導致構建失敗。

現在,構建系統總是從源樹中的模塊/設置中讀取。我們鼓勵那些想要定制該文件的人在cpython的Git分支或作為補丁文件來維護他們的更改,就像他們對源代碼樹的任何其他更改一樣。

(由Antoine Pitrou在BPO-32430中提供。)

貶低
elementTree模塊中已棄用的方法getChildren()和getIterator()現在發出一個DeprecationWarning,而不是PendingDeprecationWarning。它們將在Python3.9中被刪除。(由Serhiy Storchaka在BPO-29209中提供。)

將不是concurrent.futures.threadpoolexecutor實例的對象傳遞到asyncio.loop.set_default_executor()已被棄用,在python 3.9中將被禁止。(由Elvis Pranskevichus在BPO-34075中提供。)

xml.dom.pulldom.domEventstream、wsgiref.util.filewrapper和fileinput.fileinput的getitem方法已被棄用。

這些方法的實現忽略了它們的索引參數,而是返回下一個項。

(由Berker Peksag在BPO-9372中提供。)

AST類num、str、bytes、nameconstant和省略號被視為已棄用,將在將來的Python版本中刪除。應改用常量。(由Serhiy Storchaka在BPO-32892中提供。)

getText模塊中不推薦使用以下函數和方法:lgetText()、ldgetText()、lngetText()和ldngettext()。它們返回已編碼的字節,如果轉換后的字符串存在編碼問題,則可能會出現意外的與Unicode相關的異常。在python 3中使用返回unicode字符串的替代方法要好得多。這些功能已經中斷很長時間了。

函數bind_textDomain_codeset()、方法output_charset()和set_output_charset()以及函數translation()和install()的codeset參數也不推薦使用,因為它們僅用於l*getText()函數。

(由Serhiy Storchaka在BPO-33710中提供。)

threading.thread的isalive()方法已被棄用。(董希娜在BPO-35283中作了貢獻。)

API和功能刪除
以下特性和API已從Python3.8中刪除:

已刪除python 3.7中不推薦使用的macpath模塊。(由Victor Stinner在BPO-35471中提供。)
函數platform.popen()已被刪除,由於python 3.3,它已被棄用:改用os.popen()。
pyvenv腳本已被刪除,取而代之的是python3.8-m venv,以幫助消除關於pyvenv腳本所綁定的Python解釋器的混淆。(由BPO-25427中的布雷特加農提供。)
Parse_qs、Parse_qsl和Escape從CGI模塊中刪除。不推薦使用python 3.2或更高版本。
文件模式功能從tarfile模塊中刪除。自python 3.3以來,它沒有被記錄和棄用。
xmlparser構造函數不再接受html參數。它從未起作用,在Python3.4中被棄用。所有其他參數現在都是關鍵字。(由Serhiy Storchaka在BPO-29209中提供。)
已刪除xmlparser的doctype()方法。(由Serhiy Storchaka在BPO-29209中提供。)
移植到python 3.8
本節列出了前面描述的更改和可能需要更改代碼的其他錯誤修復。

python行為的變化
現在在理解和生成器表達式中不允許使用yield表達式(yield和yield from子句)(除了最左邊的for子句中的iterable表達式)。(由Serhiy Storchaka在BPO-10544中提供。)
當標識檢查(is和is)與某些類型的文本(如字符串、int)一起使用時,編譯器現在生成一個語法警告。這些通常可以在cpython中意外使用,但語言規范並不能保證。警告建議用戶使用相等測試(==和!)相反)。(由Serhiy Storchaka在BPO-34850中提供。)
python api中的更改
函數platform.popen()已被刪除,由於python 3.3,它已被棄用:改用os.popen()。
tkinter.ttk.TreeView類的selection()方法不再采用參數。在python 3.6中,不贊成將它與更改選擇的參數一起使用。使用諸如selection_set()之類的專門方法更改選擇。(由Serhiy Storchaka在BPO-31508中提供。)
用標記“r”打開的dbm.dumb數據庫現在是只讀的。帶有標記“r”和“w”的dbm.dumb.open()不再創建不存在的數據庫。(由Serhiy Storchaka在BPO-32749中提供。)
在xmlparser的子類中定義的doctype()方法將不再被調用,並將導致發出runtimewarning而不是deprecationwarning。在處理XML doctype聲明的目標上定義doctype()方法。(由Serhiy Storchaka在BPO-29209中提供。)
當自定義元類不提供傳遞給類型的命名空間中的\類單元格\項時,會引發runtimeError。python 3.6–3.7中發出了拒絕警告。(由Serhiy Storchaka在BPO-23722中提供。)
cprofile.profile類現在可以用作上下文管理器。(Scott Sanderson在BPO-29235中作了貢獻。)
shutil.copyfile()、shutil.copy()、shutil.copy2()、shutil.copytree()和shutil.move()使用平台特定的“快速復制”系統調用(請參閱依賴平台的高效復制操作部分)。
windows上的shutil.copyfile()默認緩沖區大小已從16 kib更改為1 mib。
PYGC頭結構已完全更改。所有接觸到結構成員的代碼都應該重寫。(見BPO-33597)
現在可以通過將name關鍵字參數傳遞給asyncio.create_task()或create_task()事件循環方法,或通過對任務對象調用set_name()方法來命名asyncio任務。任務名在asyncio.task的repr()輸出中可見,也可以使用get_name()方法進行檢索。
mmap.flush()方法現在在成功時返回none,並在所有平台下的錯誤時引發異常。以前,它的行為依賴於平台:成功時返回非零值;錯誤時在Windows下返回零。成功時返回零值;在Unix下發生錯誤時引發異常。(由Berker Peksag在BPO-2122中提供。)
函數math.factorial()不再接受不類似int的參數。(由Pablo Galindo在BPO-33083中提供。)
默認情況下,xml.dom.minidom和xml.sax模塊不再處理外部實體。(由Christian Heimes在BPO-17239中提供。)
從只讀DBM數據庫(dbm.dumb、dbm.gnu或dbm.ndbm)中刪除鍵會引發錯誤(dbm.dumb.error、dbm.gnu.error或dbm.ndbm.error),而不是keyError。(由Xiang Zhang在BPO-33106中提供。)
cpython字節碼更改
解釋器循環通過將塊堆棧展開到編譯器中的邏輯進行了簡化。編譯器現在發出明確的指令來調整值的堆棧,並調用清除中斷、繼續和返回代碼。

移除的操作碼中斷_循環、繼續_循環、設置_循環和設置_除外。添加新的操作碼rot_4,開始_finally,調用_finally和pop_finally。最終改變了end_的行為,並開始清理。

(由Mark Shannon、Antoine Pitrou和Serhiy Storchaka在BPO-17611中提供。)

添加了新的操作碼end_async_,用於處理在async for循環中等待下一項時引發的異常。(由Serhiy Storchaka在BPO-33041中提供。)

演示工具
添加了一個基准腳本,用於計時訪問變量的各種方式:工具/腳本/var_access_benchm.py。(由Raymond Hettinger在BPO-35884中提供。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM