Python?代碼智能感知類(lèi)型標(biāo)注與特殊注釋詳解
一個(gè)不會(huì)寫(xiě)好的類(lèi)型標(biāo)注和注釋的Python程序員,是讓使用TA的代碼的人都痛苦無(wú)比的事情……
—— 某某大佬
一、代碼智能感知
想必大部分現(xiàn)代的集成開(kāi)發(fā)環(huán)境(IDE)都有代碼智能感知功能吧!
智能感知(IntelliSense),就是在我們寫(xiě)代碼的時(shí)候,代碼編輯器自動(dòng)彈出我們代碼中需要補(bǔ)全的部分,而這些補(bǔ)全的部分就是代碼編輯器通過(guò)智能感知得到的,最重要的是,代碼編輯器智能地感知補(bǔ)全的部分是通過(guò)代碼中的變量的類(lèi)型來(lái)得到的。
一般的智能感知
說(shuō)了這么多之后,大家一定都清楚智能感知是什么了,但有些時(shí)候,代碼卻沒(méi)有智能感知(如下)
智能感知失效
當(dāng)代碼量很大的時(shí)候,代碼的智能感知是十分重要的,它可以幫你迅速了解到這個(gè)變量那個(gè)變量是個(gè)什么東西,以減少你生產(chǎn)BUG!
寫(xiě)一個(gè)好的注釋?zhuān)ɑ蛘哳?lèi)型標(biāo)注),不僅僅是方便未來(lái)復(fù)用你代碼的人,也是為了自己,實(shí)際上,“為了自己”可不只是簡(jiǎn)單的方便自己了解代碼,更多的是讓IDE智能地感知到你的代碼,IDE理解了你的代碼,它就會(huì)為你提供對(duì)應(yīng)的信息(如代碼補(bǔ)全和提示作用),這對(duì)程序員是極其友好的!
通過(guò)了解后面的類(lèi)型標(biāo)注和特殊的注釋,你將解決幾乎所有的智能感知失效的問(wèn)題!
二、類(lèi)型標(biāo)注
Python的類(lèi)型標(biāo)注有幾種,在下面我給出我所知道的一些
函數(shù)參數(shù)的類(lèi)型標(biāo)注 【簡(jiǎn)單操作】
def function(num: int, string: str): pass
在上面的代碼中,函數(shù)參數(shù)的后面跟了一個(gè)冒號(hào)和一個(gè)類(lèi)名,代表參數(shù)的數(shù)據(jù)類(lèi)型,這個(gè)類(lèi)名可以是內(nèi)置的類(lèi),如str、int、float等,也可以是自己定義的類(lèi)、也可以是模塊、庫(kù)中的類(lèi),如tkinter.Tk
num參數(shù)是int類(lèi)型的,string參數(shù)是str類(lèi)型的,這些類(lèi)型標(biāo)注不僅僅在函數(shù)被定義的地方可以被看見(jiàn),在調(diào)用該函數(shù)的時(shí)候也能通過(guò)IDE的智能感知而被看見(jiàn)(如下)
函數(shù)參數(shù)的類(lèi)型標(biāo)注
這個(gè)類(lèi)型標(biāo)注之后,并不會(huì)強(qiáng)制該參數(shù)使用該類(lèi)型,它只是起提示作用,相當(dāng)于注釋?zhuān)瑫r(shí),IDE會(huì)通過(guò)智能感知該類(lèi)型標(biāo)注,給出相應(yīng)的代碼提示
代碼提示作用
【高級(jí)操作】
import typing def function(num: int, lis: list[int], key: typing.Literal[4, 5, 6], string: str | None = '123'): pass
上面的代碼中:
list[int] 的意思是,lis參數(shù)的數(shù)據(jù)類(lèi)型為一個(gè)內(nèi)含整數(shù)數(shù)據(jù)的列表類(lèi)型
typing是一個(gè)官方的內(nèi)置模塊,專(zhuān)門(mén)用于類(lèi)型標(biāo)注,typing.Literal[4, 5, 6] 表示參數(shù)key的預(yù)期值只能為4或者5或者6,也就是說(shuō),該函數(shù)接收的key參數(shù),它只希望它是4、5或者6這三個(gè)值中的一個(gè)
str | None 的意思是,string參數(shù)的數(shù)據(jù)類(lèi)型可以為str或者是None類(lèi)型,此處說(shuō)明一下,類(lèi)型標(biāo)注中用 “|” 代表或者的這種操作是在 Python3.10 的時(shí)候才加入的,在之前的版本中,這種用法只在 pyi 文件(Python存根文件)中可以用
下面的代碼提示中,我們就能看到類(lèi)似于上面的類(lèi)型標(biāo)注的作用
高級(jí)操作
順便一提,那個(gè)省略號(hào)(三個(gè)連續(xù)的小數(shù)點(diǎn))的意思的默認(rèn)值(一般用于pyi存根文件中)
函數(shù)返回值的類(lèi)型標(biāo)注
def pow(m: int, n: int) -> int: return m**n
函數(shù)返回值的類(lèi)型標(biāo)注類(lèi)似于上面所說(shuō)的參數(shù)類(lèi)型標(biāo)注,只不過(guò)這里標(biāo)注的類(lèi)型只的是函數(shù)的返回值的數(shù)據(jù)類(lèi)型,同樣的,只起提示作用,沒(méi)有強(qiáng)制效果
這個(gè)標(biāo)注也有高級(jí)用法,與上面的完全,一樣,此處不再贅述
順便一提,list[int, int, int] 表示一個(gè)含有三個(gè)整數(shù)數(shù)據(jù)的列表類(lèi)型
變量的類(lèi)型標(biāo)注
傳言有一種從天而降的寫(xiě)法,不知大家見(jiàn)過(guò)沒(méi)有
key: int key = 3 """ 或者這樣寫(xiě): key: int = 3 """ print(key) # 輸出3
這個(gè)變量名后面加一個(gè)冒號(hào)、再加一個(gè)類(lèi)名的寫(xiě)法也是類(lèi)型標(biāo)注的一種,只不過(guò)它不是函數(shù)的參數(shù),而是一般變量而已,用法同上
那么,這個(gè)類(lèi)型標(biāo)注有什么用呢?直接賦值給該變量一個(gè)列表,那么IDE不也能識(shí)別它么?
這對(duì)于一般的變量確實(shí)沒(méi)啥用,但是,下面的這種操作,你可看好了
變量的類(lèi)型標(biāo)注
上面的這種情況,當(dāng)變量沒(méi)有提前做好類(lèi)型標(biāo)注時(shí),后面寫(xiě)代碼就因?yàn)闆](méi)有IDE的提示而極其麻煩
變量的類(lèi)型標(biāo)注還有一種方法,將在后面的 特殊的注釋 中講到
三、特殊的注釋
一段看似普通的注釋?zhuān)瑢?shí)際也有著特殊的作用,就像C#中的特殊注釋一樣(三條斜杠“///”),Python也有著它特殊的注釋
【三引號(hào)注釋】
想必一個(gè)合格的Python程序員,都知道三引號(hào)注釋的特殊作用吧
它不僅僅是一段普通的注釋?zhuān)梢該Q行(都知道的),它寫(xiě)在函數(shù)和類(lèi)下面表示幫助文檔等等……這里就不再贅述了
【特殊的 # 注釋】
它只能單行注釋……除此之外難道它還有別的特性???對(duì)!別的特性!
當(dāng) # 注釋以這樣一種格式寫(xiě)的時(shí)候,它有著和類(lèi)型標(biāo)注同樣的效果?。?!
key = [] # type: list[float]
# 注釋后面寫(xiě)上 type,再加一個(gè)冒號(hào)、然后加上數(shù)據(jù)類(lèi)型,它就成了類(lèi)型標(biāo)注!??!
特殊的 # 注釋
是不是大多數(shù)人都不知道這個(gè)特性呢?
四、特殊的類(lèi)型
有一些比較特別的數(shù)據(jù)類(lèi)型,有些不是內(nèi)置的但又算是內(nèi)置的,但你又不容易找到它,比如迭代器類(lèi)型、生成器類(lèi)型、函數(shù)類(lèi)型(Python里函數(shù)實(shí)際也是個(gè)對(duì)象,也有類(lèi)型)等等,下面給出一個(gè)表格方便大家進(jìn)行類(lèi)型的標(biāo)注
類(lèi)型名稱(chēng) | 數(shù)據(jù)類(lèi)型 | 引用方式 |
函數(shù) | 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 代碼智能感知類(lèi)型標(biāo)注與特殊注釋詳解的詳細(xì)內(nèi)容,更多關(guān)于Python 智能感知類(lèi)型標(biāo)注的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python?pandas數(shù)據(jù)處理之刪除特定行與列
Pandas是數(shù)據(jù)科學(xué)中的利器,你可能想到的數(shù)據(jù)處理騷操作,貌似用Pandas都能夠?qū)崿F(xiàn),下面這篇文章主要給大家介紹了關(guān)于python?pandas數(shù)據(jù)處理之刪除特定行與列的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08網(wǎng)紅編程語(yǔ)言Python將納入高考你怎么看?
12月編程語(yǔ)言排行榜出爐,在編程排行榜上,排名第四的是Python。而網(wǎng)絡(luò)上也瘋傳,編程語(yǔ)言Python將納入高考,Python不虧是網(wǎng)紅的編程語(yǔ)言2018-06-06python中的標(biāo)準(zhǔn)庫(kù)html
html庫(kù)是用于解析HTML的一個(gè)工具,是python自帶的標(biāo)準(zhǔn)庫(kù)之一,今天通過(guò)本文給大家介紹下python中的標(biāo)準(zhǔn)庫(kù)html,感興趣的朋友一起看看吧2022-04-04Python+Opencv實(shí)戰(zhàn)之人臉追蹤詳解
人臉處理是人工智能中的一個(gè)熱門(mén)話(huà)題,人臉處理可以使用計(jì)算機(jī)視覺(jué)算法從人臉中自動(dòng)提取大量信息。本文將展示OpenCV Python實(shí)現(xiàn)人臉追蹤的示例代碼,需要的可以參考一下2021-11-11python3 xpath和requests應(yīng)用詳解
這篇文章主要介紹了python3 xpath和requests應(yīng)用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Python學(xué)習(xí)筆記之json模塊和pickle模塊
json和pickle模塊是將數(shù)據(jù)進(jìn)行序列化處理,并進(jìn)行網(wǎng)絡(luò)傳輸或存入硬盤(pán),下面這篇文章主要給大家介紹了關(guān)于Python學(xué)習(xí)筆記之json模塊和pickle模塊的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05python實(shí)現(xiàn)經(jīng)典排序算法的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)經(jīng)典排序算法的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02