Python 3.8 穩定版正式發佈,新特性全面解讀 免費資料領取

Python 3.8 穩定版正式發佈,新特性全面解讀 免費資料領取

早在之前關於 Python 新版本的文檔在官方一就直處於更新模式中,就在昨日 Python 3.8 穩定版正式發佈了,讓我們來看看新版本有哪些新特性呢?

Python 3.8.0 穩定版的新特性

1PEP 572,賦值表達式

有一種新語法:=可將值賦給變量,作為較大表達式的一部分。由於它與海象的眼睛和象牙很像,因此被親切地稱為“海象操作員” 。

在此示例中,賦值表達式有助於避免調用 len()兩次:

<code>if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")/<code>

在正則表達式匹配期間會產生類似的好處,其中需要兩次匹配對象,一次是測試是否發生匹配,另一次是提取子組:

<code>discount = 0.0
if (mo := re.search(r'(\\d+)% discount', advertisement)):
discount = float(mo.group(1)) / 100.0/<code>

該運算符對 while 循環也很有用,該循環計算一個值以測試循環終止,然後在循環體中再次需要相同的值:

<code># Loop over fixed length blocks
while (block := f.read(256)) != '':
process(block)/<code>

另一個具有啟發性的用例出現在列表理解中,其中表達式主體中還需要在過濾條件下計算出的值:

<code>[clean_name.title() for name in names
if (clean_name := normalize('NFC', name)) in allowed_names]/<code>

嘗試限制使用海象運算符來清理可降低複雜性並提高可讀性的案例。

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 初始化,從而提供了對整個配置的更好控制和更好的錯誤報告。

Python 3.8 穩定版正式發佈,新特性全面解讀 免費資料領取

該 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 模塊提供(臨時)支持,用於從第三方程序包中讀取元數據。例如,它可以提取已安裝的軟件包的版本號,入口點列表等:

<code>>>> # 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')]/<code>


改進模塊

異步

運行將啟動本地異步 REPL。這樣就可以快速測試具有頂級代碼的代碼。不再需要直接調用,這將在每次調用時產生一個新的事件循環:python -m asyncioawaitasyncio.run()

<code>$ python -m asyncio
asyncio REPL 3.8.0
Use "await" directly instead of "asyncio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio
>>> await asyncio.sleep(10, result='hello')
hello/<code>

在 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 方法的反函數。

GC

get_objects() 現在可以接收可選的生成參數,該參數指示從中獲取對象的生成。

單元測試

  • 添加 AsyncMock 以支持的異步版本 Mock。還添加了用於測試的適當的新斷言函數。
  • 已添加 addModuleCleanup() 和 addClassCleanup() 進行單元測試以支持對 setUpModule() 和的 清理 setUpClass()。
  • 現在,一些模擬斷言函數還會在失敗時打印實際調用的列表。
  • unittest 該模塊獲得了對協程的支持,可以與協程一起使用unittest.IsolatedAsyncioTestCase。

例:

<code>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()/<code>

.........

其他

  • 在 macOS 上,默認情況下現在在多處理中使用 spawn start 方法
  • 現在,多處理(multiprocessing)可以使用共享內存段
  • typed_ast 合併回 CPython
  • LOAD_GLOBAL 現在快了 40%
  • pickle 現在默認使用協議 4,提高了性能

獲取方式:

1.評論區評論

2.關注並私信小編“學習” 領取資源,小編會第一時間回覆

私信方法:點擊小編頭像,進入小編主頁關注,右上角私信

注意:頭條沒有認證手機的沒有私信功能哦!

資料整理不易,希望大家拿到資源可以給個好評,謝謝大家啦!

祝大家學習愉快哦!


分享到:


相關文章: