Python 3.8 稳定版正式发布,新特性全面解读
早在之前關于 Python 新版本的文檔在官方一就直處于更新模式中,就在昨日 Python 3.8 穩定版正式發布了,讓我們來看看新版本有哪些新特性呢?
Python 3.8.0 穩定版的新特性
1PEP 572,賦值表達式
有一種新語法:=可將值賦給變量,作為較大表達式的一部分。由于它與海象的眼睛和象牙很像,因此被親切地稱為“海象操作員” 。
在此示例中,賦值表達式有助于避免調用 len()兩次:
if (n := len(a)) > 10:print(f"List is too long ({n} elements, expected <= 10)")在正則表達式匹配期間會產生類似的好處,其中需要兩次匹配對象,一次是測試是否發生匹配,另一次是提取子組:
discount = 0.0 if (mo := re.search(r'(\d+)% discount', advertisement)): discount = float(mo.group(1)) / 100.0該運算符對 while 循環也很有用,該循環計算一個值以測試循環終止,然后在循環體中再次需要相同的值:
# Loop over fixed length blocks while (block := f.read(256)) != '': process(block)另一個具有啟發性的用例出現在列表理解中,其中表達式主體中還需要在過濾條件下計算出的值:
[clean_name.title() for name in namesif (clean_name := normalize('NFC', name)) in allowed_names]嘗試限制使用海象運算符來清理可降低復雜性并提高可讀性的案例。
2PEP 570,僅位置的參數
有一個新的函數參數語法,/以指示某些函數參數必須在位置上指定,并且不能用作關鍵字參數。這 help() 與用 Larry Hastings 的 Argument Clinic 工具注釋的 C 函數所顯示的符號相同。
3并行文件系統緩存,用于編譯的字節碼
新的 PYTHONPYCACHEPREFIX 設置(也可作為 )將隱式字節碼緩存配置為使用單獨的并行文件系統樹,而不是每個源目錄中的默認子目錄。-X pycache_prefix__pycache__
緩存的位置報告在 sys.pycache_prefix (None指示__pycache__ 子目錄中的默認位置)。
4調試版本與發行版本共享 ABI
不管是在發布模式還是調試模式下構建,Python 現在都使用相同的 ABI。在 Unix 上,當 Python 以調試模式構建時,現在可以加載以發布模式構建的 C 擴展和使用穩定 ABI 構建的 C 擴展
?
5f 字符串支持一個方便的 = 說明符進行調試
= 在 f-string 中添加了一個說明符。f 字符串(例如) f'{expr=}' 將擴展為表達式的文本,等號,然后擴展為求值表達式的表示形式
6PEP 578:Python運行時審核掛鉤
PEP 添加了“審核掛鉤”和“已驗證的打開掛鉤”。兩者都可以從 Python 和本機代碼獲得,從而允許使用純Python代碼編寫的應用程序和框架利用額外的通知,同時還允許嵌入程序或系統管理員在始終啟用審核的情況下部署Python 版本。
7PEP 587:Python初始化配置
在 PEP 587 添加了新的 C API 以配置 Python 初始化,從而提供了對整個配置的更好控制和更好的錯誤報告。
?
該 PEP 還向這些內部結構添加了_PyRuntimeState.preconfig(PyPreConfig類型)和 PyInterpreterState.config(PyConfig類型)字段。PyInterpreterState.config 成為新的參考配置,替換全局配置變量和其他私有變量。
8Vectorcall:對于 CPython 的一個快速調用協議
“ vectorcall”協議已添加到 Python / C API。它旨在將已經針對各種類進行的現有優化形式化。任何實現可調用的擴展類型都可以使用此協議。目前這是臨時的,目的是使其在 Python 3.9 中完全公開。
9pickle 協議 5 用于出帶外數據緩沖器
當 pickle 用于在 Python 進程之間傳輸大數據以利用多核或多計算機處理時,重要的是通過減少內存副本并可能通過應用自定義技術(例如依賴數據的壓縮)來優化傳輸。
該 pickle 協議5 引入用于出帶外緩沖器,其中支持可以根據通信層的判斷,與 PEP 3118 兼容的數據與主 pickle 流分開發送。
其他語言的變化
一個 continue 說法是非法 finally 條款因與實施問題。在Python 3.8中,這一限制被取消了。continue 現在在 finally: 塊中。
該 int 類型現在具有 as_integer_ratio() 與現有 float.as_integer_ratio() 方法兼容的新方法.
增加了對 \N{name} 的支持。
Dict 和 dictviews 現在可以使用反向插入順序進行迭代 reversed()。
函數調用中允許關鍵字名稱的語法進一步受到限制。特別是, f((keyword)=arg) 不再允許。
現在允許 Iterable 解包,而不使用括號 yield 和 return 語句。
不是有效轉義序列的反斜杠字符對 DeprecationWarning從Python 3.6 開始生成。在Python 3.8中它生成了一個SyntaxWarning代替。
SyntaxWarning 在某些情況下,編譯器會在元組或列表之前錯過逗號時生成
子類之間的算術運算 datetime.date 或 datetime.datetime 與datetime.timedelta 對象現在返回子類的實例,而不是基類。這也會影響其實現(直接或間接)使用 datetime.timedelta 算術的操作的返回類型。例如 datetime.datetime.astimezone()。
當 Python 解釋器被 Ctrl-C(SIGINT)中斷并且 KeyboardInterrupt 未捕獲到的結果異常時,Python 進程現在通過 SIGINT 信號或正確的退出代碼退出,以便調用進程可以檢測到它因 Ctrl 而死亡-C。POSIX 和 Windows 上的shell使用它來正確終止交互式會話中的腳本。
.........
新模塊
新 importlib.metadata 模塊提供(臨時)支持,用于從第三方程序包中讀取元數據。例如,它可以提取已安裝的軟件包的版本號,入口點列表等:
>>> # Note following example requires that the popular "requests" >>> # package has been installed.>>>>>> from importlib.metadata import version, requires, files>>> version('requests')'2.22.0'>>> list(requires('requests'))['chardet (<3.1.0,>=3.0.2)']>>> list(files('requests'))[:5][PackagePath('requests-2.22.0.dist-info/INSTALLER'), PackagePath('requests-2.22.0.dist-info/LICENSE'), PackagePath('requests-2.22.0.dist-info/METADATA'), PackagePath('requests-2.22.0.dist-info/RECORD'), PackagePath('requests-2.22.0.dist-info/WHEEL')]?
改進模塊
異步
運行將啟動本地異步 REPL。這樣就可以快速測試具有頂級代碼的代碼。不再需要直接調用,這將在每次調用時產生一個新的事件循環:python -m asyncioawaitasyncio.run()
$ python -m asyncio asyncio REPL 3.8.0Use "await" directly instead of "asyncio.run()".Type "help", "copyright", "credits" or "license" for more information.>>> import asyncio>>> await asyncio.sleep(10, result='hello')hello在 Windows 上,默認事件循環現在為 ProactorEventLoop
AST
AST 節點現在具有 end_lineno 和 end_col_offset 屬性,可以提供節點末端的精確位置。(這僅適用于具有 lineno 和 col_offset 屬性的節點。)
新函數 ast.get_source_segment() 返回特定 AST 節點的源代碼。
該 ast.parse() 函數具有一些新標志:
- type_comments=True 使它返回的文本 PEP 484 和 與某些 AST 節點相關聯的 PEP 526 類型注釋;
- mode='func_type' 可以用來解析 PEP 484 “簽名類型注釋”(針對功能定義 AST 節點返回);
- feature_version=(3, N)允許指定較早的 Python 3版本。(例如,將 和視為非保留字。)feature_version=(3, 4)asyncawait
集合
現在的 _asdict() 方法 collections.namedtuple() 返回 dict 而不是collections.OrderedDict。之所以可行,是因為自 3.7 以來,常規命令就保證了排序。如果需要的其他功能 OrderedDict,建議的補救措施是將結果轉換為所需的類型:OrderedDict(nt._asdict())。
日期時間
添加了新的備用構造函數datetime.date.fromisocalendar()和 datetime.datetime.fromisocalendar(),分別從 ISO 年,周號和工作日構造date和 datetime 對象;這些是每個類的 isocalendar 方法的反函數。如果大家對Python感興趣的話,可以加一下我們的學習交流摳摳群哦:649,825,285,免費領取一套學習資料和視頻課程喲~
GC
get_objects() 現在可以接收可選的生成參數,該參數指示從中獲取對象的生成。
單元測試
- 添加 AsyncMock 以支持的異步版本 Mock。還添加了用于測試的適當的新斷言函數。
- 已添加 addModuleCleanup() 和 addClassCleanup() 進行單元測試以支持對 setUpModule() 和的 清理 setUpClass()。
- 現在,一些模擬斷言函數還會在失敗時打印實際調用的列表。
- unittest 該模塊獲得了對協程的支持,可以與協程一起使用unittest.IsolatedAsyncioTestCase。
例:
import unittest class TestRequest(unittest.IsolatedAsyncioTestCase): async def asyncSetUp(self): self.connection = await AsyncConnection() async def test_get(self): response = await self.connection.get("https://example.com") self.assertEqual(response.status_code, 200) async def asyncTearDown(self): await self.connection.close()if __name__ == "__main__": unittest.main().........
其他
- 在 macOS 上,默認情況下現在在多處理中使用 spawn start 方法
- 現在,多處理(multiprocessing)可以使用共享內存段
- typed_ast 合并回 CPython
- LOAD_GLOBAL 現在快了 40%
- pickle 現在默認使用協議 4,提高了性能
?
新增、改進具體信息太多,詳細的我們就不一一給大家羅列了,小伙伴們可邊用邊自行查看官方文檔了解新改變(詳細信息地址:https://docs.python.org/3.8/whatsnew/changelog.html#changelog)
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Python 3.8 稳定版正式发布,新特性全面解读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公众号质量改进调查问卷
- 下一篇: 基于线性SVM的CIFAR-10图像集分