Python 代碼智能感知類型標註與特殊註釋詳解

一個不會寫好的類型標註註釋的Python程序員,是讓使用TA的代碼的人都痛苦無比的事情……

—— 某某大佬

一、代碼智能感知

想必大部分現代的集成開發環境(IDE)都有代碼智能感知功能吧!

智能感知(IntelliSense),就是在我們寫代碼的時候,代碼編輯器自動彈出我們代碼中需要補全的部分,而這些補全的部分就是代碼編輯器通過智能感知得到的,最重要的是,代碼編輯器智能地感知補全的部分是通過代碼中的變量的類型來得到的。

一般的智能感知

說瞭這麼多之後,大傢一定都清楚智能感知是什麼瞭,但有些時候,代碼卻沒有智能感知(如下)

智能感知失效

當代碼量很大的時候,代碼的智能感知是十分重要的,它可以幫你迅速瞭解到這個變量那個變量是個什麼東西,以減少你生產BUG!

寫一個好的註釋(或者類型標註),不僅僅是方便未來復用你代碼的人,也是為瞭自己,實際上,“為瞭自己”可不隻是簡單的方便自己瞭解代碼,更多的是讓IDE智能地感知到你的代碼,IDE理解瞭你的代碼,它就會為你提供對應的信息(如代碼補全和提示作用),這對程序員是極其友好的!

通過瞭解後面的類型標註特殊的註釋,你將解決幾乎所有的智能感知失效的問題!

二、類型標註

Python的類型標註有幾種,在下面我給出我所知道的一些

函數參數的類型標註 【簡單操作】

def function(num: int, string: str):
    pass

在上面的代碼中,函數參數的後面跟瞭一個冒號和一個類名,代表參數的數據類型,這個類名可以是內置的類,如str、int、float等,也可以是自己定義的類、也可以是模塊、庫中的類,如tkinter.Tk

num參數是int類型的,string參數是str類型的,這些類型標註不僅僅在函數被定義的地方可以被看見,在調用該函數的時候也能通過IDE的智能感知而被看見(如下)

函數參數的類型標註

這個類型標註之後,並不會強制該參數使用該類型,它隻是起提示作用,相當於註釋,同時,IDE會通過智能感知該類型標註,給出相應的代碼提示

代碼提示作用

【高級操作】

import typing
 
def function(num: int,
             lis: list[int],
             key: typing.Literal[4, 5, 6],
             string: str | None = '123'):
    pass

上面的代碼中:

list[int] 的意思是,lis參數的數據類型為一個內含整數數據的列表類型

typing是一個官方的內置模塊,專門用於類型標註,typing.Literal[4, 5, 6] 表示參數key的預期值隻能為4或者5或者6,也就是說,該函數接收的key參數,它隻希望它是4、5或者6這三個值中的一個

str | None 的意思是,string參數的數據類型可以為str或者是None類型,此處說明一下,類型標註中用 “|” 代表或者的這種操作是在 Python3.10 的時候才加入的,在之前的版本中,這種用法隻在 pyi 文件(Python存根文件)中可以用

下面的代碼提示中,我們就能看到類似於上面的類型標註的作用

高級操作

順便一提,那個省略號(三個連續的小數點)的意思的默認值(一般用於pyi存根文件中)

函數返回值的類型標註

def pow(m: int, n: int) -> int:
    return m**n

函數返回值的類型標註類似於上面所說的參數類型標註,隻不過這裡標註的類型隻的是函數的返回值的數據類型,同樣的,隻起提示作用,沒有強制效果

這個標註也有高級用法,與上面的完全,一樣,此處不再贅述

順便一提,list[int, int, int] 表示一個含有三個整數數據的列表類型

變量的類型標註

傳言有一種從天而降的寫法,不知大傢見過沒有

key: int
key = 3
 
"""
或者這樣寫:
key: int = 3
"""
 
print(key) # 輸出3

這個變量名後面加一個冒號、再加一個類名的寫法也是類型標註的一種,隻不過它不是函數的參數,而是一般變量而已,用法同上

那麼,這個類型標註有什麼用呢?直接賦值給該變量一個列表,那麼IDE不也能識別它麼?

這對於一般的變量確實沒啥用,但是,下面的這種操作,你可看好瞭

變量的類型標註

上面的這種情況,當變量沒有提前做好類型標註時,後面寫代碼就因為沒有IDE的提示而極其麻煩

變量的類型標註還有一種方法,將在後面的 特殊的註釋 中講到

三、特殊的註釋

一段看似普通的註釋,實際也有著特殊的作用,就像C#中的特殊註釋一樣(三條斜杠“///”),Python也有著它特殊的註釋

【三引號註釋】

想必一個合格的Python程序員,都知道三引號註釋的特殊作用吧

它不僅僅是一段普通的註釋,它可以換行(都知道的),它寫在函數和類下面表示幫助文檔等等……這裡就不再贅述瞭

【特殊的 # 註釋】

它隻能單行註釋……除此之外難道它還有別的特性???對!別的特性!

當 # 註釋以這樣一種格式寫的時候,它有著和類型標註同樣的效果!!!

key = [] # type: list[float]

# 註釋後面寫上 type,再加一個冒號、然後加上數據類型,它就成瞭類型標註!!!

特殊的 # 註釋

是不是大多數人都不知道這個特性呢?

四、特殊的類型

有一些比較特別的數據類型,有些不是內置的但又算是內置的,但你又不容易找到它,比如迭代器類型、生成器類型、函數類型(Python裡函數實際也是個對象,也有類型)等等,下面給出一個表格方便大傢進行類型的標註

類型名稱 數據類型 引用方式
函數 function

function

types.FunctionType

方法 method

types.MethodType

迭代器 Iterator

typing.Iterator

collections.abc.Iterator

生成器 Generator

typing.Generator

collections.abc.Generator

序列 Sequence

typing.Sequence

collections.abc.Sequence

以上就是Python 代碼智能感知類型標註與特殊註釋詳解的詳細內容,更多關於Python 智能感知類型標註的資料請關註WalkonNet其它相關文章!

推薦閱讀: