Python類型標注入門與初探

本文主要介紹Python中類型標注的作用,以及最常用的類型標注應該怎么寫。

由于Python屬于動態(tài)類型語言,所以只有在運行代碼的時候才能夠知道變量類型,而這往往會讓我們在調(diào)用其他人的代碼,或者自己很久以前(昨天)寫的代碼時傳入錯誤的變量類型,導致bug產(chǎn)生。

所以在Python3.5的時候開始引入了類型標注(Type Hint),讓我們能夠顯式地標注變量類型。

類型標注的優(yōu)點

下面就是一個簡單的帶有類型標注的函數(shù):


進行類型標注之后,有什么優(yōu)點呢?

  1. 函數(shù)的可讀性會增強。
  2. 使用這個函數(shù)時,IDE會顯示這個函數(shù)的輸入?yún)?shù)跟輸出值是什么類型。
  3. 能幫我們解決一些由類型導致的邏輯問題,不用運行代碼時就能夠?qū)Υa進行分析。

靜態(tài)分析工具mypy

不用運行代碼時就能夠?qū)Υa進行分析的工具,我們稱為靜態(tài)分析工具,這里介紹的是mypy。

要使用mypy之前,需要先通過pip進行安裝:

pip install mypy

安裝好之后有以下兩種使用方法。

方法一 在命令行中輸入命令對文件進行檢查

mypy example.py

方法二 在vscode中直接啟用mypy檢查

打開“settings.json”文件,增加下面這行設置:

"python.linting.mypyEnabled": true,

修改完之后再返回代碼編輯,可以發(fā)現(xiàn)直接在編輯過程中就能顯示錯誤了:


自定義數(shù)據(jù)類型的類型標注

Python的內(nèi)置數(shù)據(jù)類型都是可以拿來做類型標注的,例入int、float、list等等。

這里不做贅述,主要介紹自定義數(shù)據(jù)類型應該如何處理。

可以看到,在第9行函數(shù)的輸入是類本身的時候是會報錯的,而第10行的時候函數(shù)的輸入類的實例化對象是沒有任何問題的。

下面再介紹一種特殊情況,就是在類的方法里面需要用到這個類的類型的時候,但是這個類在寫這個方法時還沒有被定義,也就是遇到了“先有雞還是先有蛋”的問題,這樣寫是會報錯的:


這種情況下可以在Node加上雙引號,把他變成String,就能解決循環(huán)依賴的問題:

列表類型標注

在很多場景下,我們不僅要求參數(shù)類型是list,還要求list內(nèi)的對象是int類型,那么可以這樣寫:

from typing import List


def my_sum(lst: List[int]) -> int:
    total = 0
    for i in lst:
        total += i
    return total

對于Python3.9及更新版本,可以這樣寫:

def my_sum(lst: list[int]) -> int:
    total = 0
    for i in lst:
        total += i
    return total

在實際使用中,我們可能會允許一個參數(shù)可以是list或者tuple,那么我們可以引入更抽象的Sequence

可以看到,Sequence不僅支持listtuple,還支持byterange

字典類型標注

由于dict是有key和value的,因此需要同時對兩者進行類型注解,中間用,隔開:

允許多種數(shù)據(jù)類型的標注

在很多情況下,我們允許一個參數(shù)傳入int/None多種數(shù)據(jù)類型,那么可以這樣表示:

而在Python3.10之后也可以簡寫為:

由于參數(shù)允許None是很常見的,所以Python也提供了Optional,默認是包含None類型的,這樣寫起來更簡潔:

也就是說,以上這3種寫法都是等價的(注意第二種寫法僅在Python3.10之后支持)。

小結(jié)

本文是對Python類型標注的一個基礎用法進行簡單講解,看完之后就可以嘗試著在我們的Python項目中增加類型標注了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容