認識Python 3.7: 數據類, async/await 及更多新特性!
如果你像我一樣,或者像許多其他Python開發人員一樣,你可能經歷過(或者遷移過)幾個版本的發布。Python 3.7(.3)是最新的發行版之一,它包含了一些令人印象深刻的新語言特性,這些特性有助於將Python保持為最簡單、最強大的語言之一。如果你已經在使用一個python3.x版本,你應該考慮升級到Python 3.7。請繼續閱讀,以了解更多令人興奮的特性和改進。
數據類
在3.7版本之前以面向對象的方式使用Python時最乏味的部分之一就是創建類來表示應用程序中的數據。
在Python 3.7之前,你必須在類中聲明一個變數,然後在__init__方法中從一個命名參數設置它。對於具有複雜數據模型的應用程序,這必然會導致你必須維護大量樣板模型和數據契約代碼。
使用Python 3.7,你現在能夠使用一個被稱為@dataclass的裝飾器,它會自動在你向類變數添加類型註解時為你添加一個隱式的__init__函數,這都得歸功於PEP-557。當該裝飾器被添加後,Python會自動檢查相關類的屬性和類型註解,並生成一個帶有指定參數順序的__init__函數。
你仍然可以向你的數據類添加類方法,並像使用其他類一樣使用它。有關對JSON的支持,請參閱PYPI上的庫dataclasses-json。
asyncio 和 async/await 關鍵字
這裡最明顯的變化是:async和await現在是Python中的保留關鍵字。這與對asyncio 的一些改進是同步的。值得注意的是,這包括高級API的改進,它使非同步函數的運行更加容易。我們以下面的例子為例,說明在Python 3.7之前,要使用非同步函數需要做些什麼:
現在,在Python 3.7中:
breakpoint()
在以前的Python版本中,使用內置的Python調試器(pdb)添加斷點需要import pdb; pdb.set_trace()。
PEP-553增加了使用一個新的關鍵字和函數的能力,稱為breakpoint,使用方式如下:
當從控制台運行時,這將直接進入pdb,並允許用戶輸入調試語句、計算變數和逐步執行程序。有關如何使用pdb的更多信息,請參見這裡。(https://docs.python.org/3/library/pdb.html )
通過模塊屬性延遲載入
一些有經驗的Python用戶可能熟悉用於類和對象的__getattr__和dir方法。PEP-562還為模塊公開了__getattr__方法。
在不深入探討這種方法所暴露的技術可能性的情況下,它最清晰和最明顯的用例之一是,它現在允許模塊延遲載入。請思考下面的例子(從PEP-562修改而來)以及它的用法。
/mymodule/__init__.py
/mymodule/mysubmodule.py
/main.py
注意,儘管我們在本例中導入了mymodule,但是包含BigClass的子模塊直到我們調用它時才進行載入。
上下文變數
在3.7之前的Python事件循環中使用async/await函數時,使用線程本地變數的上下文管理器有可能會在執行過程中釋放值,這可能會造成難以發現的bug。
Python 3.7引入了上下文變數的概念,上下文變數根據上下文會具有不同的值。它們類似於也有可能具有不同值的線程局部變數,但是它們不是在執行線程之間不同,而是在執行上下文之間不同,因此,它們與async和await函數相兼容。
下面是一個如何在Python 3.7中設置和使用上下文變數的快速示例。請注意,當你運行這個例子時,第二個async調用將生成一個默認值,因為它在不同的上下文中進行了計算。
預置的字典順序
在許多版本中,Python字典都被認為是無序的字典,這意味著你可以用Python 3.6或更早的版本編寫以下代碼,並且在遍歷鍵時,可能會出現無序的結果。
對於那些以前的版本,可以使用collections模塊的OrderedDict對象來補救,它為某些用例提供了所需的強制順序保證。
在Python 3.6中,字典被重新實現為有序字典,現在在Python 3.7中,有序字典正式成為語言規範的一部分。這意味著你現在可以依賴字典順序了,但在考慮向後兼容性時也必須考慮到這一點。
即使如此,你也不要期望OrderedDict的用法會在以後版本中消失;它仍然在Python 3.7中,並且比標準dict具有更高級的操作和不同的等式比較。
而且,有序字典更新已經被證明是Python 3.7中最不受歡迎的更新之一。它會讓開發人員在無意中就含糊地定義了一個有序dict。
對Python 3.7的優化
仍然不確定是否應該試用一下Python 3.7?你應該知道Python 3.7有許多性能改進,特別是:
- Python在各種操作系統上的啟動時間減少了10-30%。
- 輸入操作更快。
- 對於常見的情況,List.sort和其他排序方法已經改進了45-70%。
- dict.copy()比以前快5.5倍。
- 通過collections.namedtuple()創建namedtuple比以前要快4-6倍。
獲取完整更新列表,請查看官方發布說明。(https://docs.python.org/3.7/whatsnew/3.7.html#optimizations )
如果你想深入了解Python3.7語言的一些特性,請查看我在PyCascades大會上的這個簡短演講。(https://youtu.be/MTdYyCKcI8Q?t=16886 )
或者你也可以在Heroku(支持多語言的雲平台)上部署一個Python應用程序試試。到2019年4月為止,如果你沒有在runtime.txt文件中顯式指定版本,則默認安裝的版本是Python 3.6.8。在runtime.txt中加入Python -3.7.3來嘗試所有這些新的Python特性吧。
Heroku是2019年Python大會(5月1-9日)的一個鑽石級贊助商。如果屆時你能來參加大會,請記得到Heroku展位向他們的團隊打個招呼吧。
英文原文:https://blog.heroku.com/python37-dataclasses-async-await
譯者:憂鬱的紅秋褲
※Python中的端對端主題建模: 隱含狄利克雷分布(LDA)
※Django快速入門
TAG:Python部落 |