【原文地址:https://xiaokang2022.blog.csdn.net/article/details/126936985】
?
一個不會寫好的型別標注和注釋的Python程式員,是讓使用TA的代碼的人都痛苦無比的事情……
—— 某某大佬
一、代碼智能感知
想必大部分現代的集成開發環境(IDE)都有代碼智能感知功能吧!
智能感知(IntelliSense),就是在我們寫代碼的時候,代碼編輯器自動彈出我們代碼中需要補全的部分,而這些補全的部分就是代碼編輯器通過智能感知得到的,最重要的是,代碼編輯器智能地感知補全的部分是通過代碼中的變數的型別來得到的,
?說了這么多之后,大家一定都清楚智能感知是什么了,但有些時候,代碼卻沒有智能感知(如下)

當代碼量很大的時候,代碼的智能感知是十分重要的,它可以幫你迅速了解到這個變數那個變數是個什么東西,以減少你生產BUG!
寫一個好的注釋(或者型別標注),不僅僅是方便未來復用你代碼的人,也是為了自己,實際上,“為了自己”可不只是簡單的方便自己了解代碼,更多的是讓IDE智能地感知到你的代碼,IDE理解了你的代碼,它就會為你提供對應的資訊(如代碼補全和提示作用),這對程式員是極其友好的!
通過了解后面的型別標注和特殊的注釋,你將解決幾乎所有的智能感知失效的問題!
二、型別標注
Python的型別標注有幾種,在下面我給出我所知道的一些
函式引數的型別標注
【簡單操作】
1 def function(num: int, string: str):
2 pass
在上面的代碼中,函式引數的后面跟了一個冒號和一個類名,代表引數的資料型別,這個類名可以是內置的類,如str、int、float等,也可以是自己定義的類、也可以是模塊、庫中的類,如tkinter.Tk
num引數是int型別的,string引數是str型別的,這些型別標注不僅僅在函式被定義的地方可以被看見,在呼叫該函式的時候也能通過IDE的智能感知而被看見(如下)
?這個型別標注之后,并不會強制該引數使用該型別,它只是起提示作用,相當于注釋,同時,IDE會通過智能感知該型別標注,給出相應的代碼提示
?【高級操作】
1 import typing
2
3 def function(num: int,
4 lis: list[int],
5 key: typing.Literal[4, 5, 6],
6 string: str | None = '123'):
7 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存根檔案中)
函式回傳值的型別標注
1 def pow(m: int, n: int) -> int:
2 return m**n
函式回傳值的型別標注類似于上面所說的引數型別標注,只不過這里標注的型別只的是函式的回傳值的資料型別,同樣的,只起提示作用,沒有強制效果
這個標注也有高級用法,與上面的完全,一樣,此處不再贅述
順便一提,list[int, int, int] 表示一個含有三個整數資料的串列型別
變數的型別標注
傳言有一種從天而降的寫法,不知大家見過沒有
1 key: int
2 key = 3
3
4 """
5 或者這樣寫:
6 key: int = 3
7 """
8
9 print(key) # 輸出3
這個變數名后面加一個冒號、再加一個類名的寫法也是型別標注的一種,只不過它不是函式的引數,而是一般變數而已,用法同上
那么,這個型別標注有什么用呢?直接賦值給該變數一個串列,那么IDE不也能識別它么?
這對于一般的變數確實沒啥用,但是,下面的這種操作,你可看好了
?上面的這種情況,當變數沒有提前做好型別標注時,后面寫代碼就因為沒有IDE的提示而極其麻煩
變數的型別標注還有一種方法,將在后面的 特殊的注釋 中講到
三、特殊的注釋
一段看似普通的注釋,實際也有著特殊的作用,就像C#中的特殊注釋一樣(三條斜杠“///”),Python也有著它特殊的注釋
【三引號注釋】
想必一個合格的Python程式員,都知道三引號注釋的特殊作用吧
它不僅僅是一段普通的注釋,它可以換行(都知道的),它寫在函式和類下面表示幫助檔案等等……這里就不再贅述了
【特殊的 # 注釋】
它只能單行注釋……除此之外難道它還有別的特性???對!別的特性!
當 # 注釋以這樣一種格式寫的時候,它有著和型別標注同樣的效果!!!
1 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 |
【看了這么多,是不是感覺又漲知識了呢?那么,你的贊呢?】
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/509109.html
標籤:其他
上一篇:6、Arrays類
