解讀python中的類(lèi)型提示(type hint)
python類(lèi)型提示(type hint)
在刷leetcode或者一些官方源碼的時(shí)候,經(jīng)??吹饺缦伦謽樱?/p>
class Solution: ? ? def sortList(self, head: ListNode) -> ListNode:
這就是類(lèi)型提示(type hint),下面來(lái)個(gè)簡(jiǎn)單的例子,
def greeting(name: str) -> str: ? ? return 'Hello ' + name
如上,其中name是傳入的參數(shù),而:右邊的str則是name期望的類(lèi)型即str,而->則指向期望函數(shù)的返回類(lèi)型。
如果不期望有返回值可以直接指向None,如下:
def feeder(get_next_item: Callable[[], str]) -> None:
Type Hints是雞肋還是最佳實(shí)踐?
定義一個(gè)這樣的函數(shù):
def add(a, b): print(a + b)
看簽名應(yīng)該不難猜出,這是做加法的,把參數(shù)a和b加起來(lái)。a和b應(yīng)該是兩個(gè)數(shù)字,或者兩個(gè)字符串。但不能一個(gè)數(shù)字一個(gè)字符串。
如果我們的目的就是為了加數(shù)字,最好能給一些說(shuō)明。
為了實(shí)現(xiàn)這個(gè)目的,有兩種做法:
一種是加注釋?zhuān)?/p>
#把參數(shù)a和b相加,a和b必須都是數(shù)字。 def add(a, b): print(a + b)
更好一點(diǎn)的做法是用docstring來(lái)寫(xiě):
def add(a, b): '''把參數(shù)a和b相加,a和b必須都是數(shù)字。''' print(a + b)
Type Hint
還有一種寫(xiě)法就是用Type Hint,直接聲明參數(shù)的類(lèi)型:
#為了簡(jiǎn)單,這里假設(shè)只能處理整數(shù) def add(a:int, b:int) -> int: print(a + b)
Type Hint是Python3.6開(kāi)始引入的一種特性。
- 通過(guò)變量名:變量類(lèi)型的寫(xiě)法指定參數(shù)的類(lèi)型
- 通過(guò)**->返回值類(lèi)型**的寫(xiě)法指定返回值的數(shù)據(jù)類(lèi)型。
除了可以用在方法中,也可以用在普通的變量上:
a:int #定義變量a,并指定a是int類(lèi)型 a = 5 print(a)
Type Hint的作用
有了Type Hint,就可以做到類(lèi)型安全了嗎?
并不是的,下面的代碼仍然能夠成功運(yùn)行:
a:int a = 5 print(a) a = 'hello' #把字符串賦值給a,并不會(huì)有運(yùn)行時(shí)錯(cuò)誤 print(a)
結(jié)合我前面講add函數(shù)的脈絡(luò),Type Hint的作用和注釋是一樣的,就是另外一種注釋手法而已,并不會(huì)Python解釋器產(chǎn)生任何影響。
如果是這樣,要它有何用?它有兩個(gè)用處:
1.給代碼的閱讀者更明確的類(lèi)型提示,調(diào)用代碼的時(shí)候傳入錯(cuò)誤類(lèi)型的可能性會(huì)降低,但完全靠自覺(jué)。
2.有了Type Hints,IDE可以在寫(xiě)代碼的過(guò)程中就給你一些類(lèi)型提示,這樣可以更順暢的寫(xiě)出安全的代碼。

我應(yīng)該用嗎?
我的建議:
- 大部分情況下沒(méi)必要使用。知道就好。
- 如果寫(xiě)共用的類(lèi)庫(kù),可以考慮使用。僅僅是考慮,也不一定要用。
我的理由是:
- 人生苦短,我用Python!如果非要夾(Java)里夾氣的,你去用Java或者其他的強(qiáng)類(lèi)型語(yǔ)言好了。
- 畢竟用了Type Hint之后,代碼看起來(lái)啰嗦多了,而且也失去了Python動(dòng)態(tài)類(lèi)型的一些優(yōu)勢(shì)。
- 還有一個(gè)理由,不加Type Hint,也可以使用Mypy實(shí)現(xiàn)類(lèi)似的效果。
我們來(lái)看幾個(gè)常用的類(lèi)庫(kù),看看它們用不用。
- 小海龜turtle - NO:

- Pandas - NO

- Openpyxl - YES

所以啊,有的用了,有的沒(méi)用。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Django Sitemap 站點(diǎn)地圖的實(shí)現(xiàn)方法
這篇文章主要介紹了Django Sitemap 站點(diǎn)地圖的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Python+gensim實(shí)現(xiàn)文本相似度分析詳解
這篇文章主要介紹了Python+gensim實(shí)現(xiàn)文本相似度分析詳解,在開(kāi)發(fā)中我們會(huì)遇到進(jìn)行文本相似度分析的需求,計(jì)算文本相似度,用于鑒別文章是否存在抄襲,需要的朋友可以參考下2023-07-07
Pycharm安裝第三方庫(kù)時(shí)Non-zero exit code錯(cuò)誤解決辦法
這篇文章主要介紹了Pycharm安裝第三方庫(kù)時(shí)Non-zero exit code錯(cuò)誤解決辦法,最好的解決辦法可以通過(guò)“Pycharm”左下角的“Terminal”,在pycharm內(nèi)使用pip安裝,以安裝“requests”為例,需要的朋友可以參考下2023-01-01
Python3爬蟲(chóng)ChromeDriver的安裝實(shí)例
在本篇文章里小編給大家整理的是一篇關(guān)于Python3爬蟲(chóng)ChromeDriver的安裝實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。2021-02-02
python 數(shù)據(jù)提取及拆分的實(shí)現(xiàn)代碼
這篇文章主要介紹了python 數(shù)據(jù)提取及拆分的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

