編者按:Feedly聯合創始人、大數據與機器學習主管Kireet Reddy分享了對Python類型提示的看法。
升級到Python 3.6后,突然發現Python通過typing模塊加入了類型提示。我得承認,我并不非常熟悉python社區,但是我覺得這樣一種語言特性應該會引起不小的反響。
不管怎么說,我對這個新特性非常滿意。在我職業生涯的大部分時間里,我在Java這個靜態類型的世界中工作,python的類型提示多少提供了一些我很懷念的必需結構。
Python的類型系統
Python是一個動態類型語言,所謂的“鴨子類型”。使用Python編程時,動態類型大概是一把至為鋒利的雙刃劍。
基本上這意味著,Python并不會在編譯步驟預先檢查所有使用的類型是合法的,Python程序將繼續愉快地運行下去,直到運行不下去為止,這時它會拋出一個TypeError。例如,下面這段Java代碼編譯不過:
publicstaticint add(int a, int b) { return a+b;}
...
add(1, "1");
Java編譯器會立即抱怨傳入了一個不兼容的類型。然而,你最喜歡的python IDE一點也不會抱怨這段等價的Python代碼:
def add(a,b):
return a+b
...
add(1,"1")
你需要運行代碼,才能碰到報錯(整型和字符串無法相加)。
這真是糟糕。但是看看這個:
>>> add(‘hello’, ‘world’)
‘helloworld’
>>> add([1,2,3], [4,5,6])
[1, 2, 3, 4, 5, 6]
好吧,看來動態類型也不完全是壞事。這同樣適用于類,只要對象存在恰當的方法,python代碼可以直接工作,無需使用接口:
classDog(object):
def talk(self, quietly):
return'woof'if quietly else'BARK'
classCat(object):
def talk(self, quietly):
return'purr'if quietly else'YOWL'
def speak(a, quietly):
print(a.talk(quietly))
>>> speak(Dog())
woof
>>> speak(Cat())
meow
妙!少打很多字,代碼非常凝練。
問題
在python項目的起初幾周這讓人感覺良好。不過接下來一周你可能離開這個項目去改進以前寫的另一些代碼。或者你需要和一個同事一起編程。
過了一段時間你回頭看代碼的時候,或者同事看你的代碼的時候,看到speak(x)這行會覺得x太含糊。于是決定跳轉到speak的定義,結果看到了a.talk。下面就沒法進一步跳轉到定義追蹤下去了,需要手動搜索查看哪些地方實現了talk這一方法,接著還需要查看這些方法做了什么,嘗試推斷出speak在talk上施加的一般契約。
解決方案
類型提示讓你可以提供更多的上下文。重寫上面的代碼:
classDog(Animal):
def talk(self, quietly: bool) -> str:
return'woof'if quietly else'BARK'
classCat(Animal):
def talk(self, quietly: bool) -> str:
return'purr'if quietly else'YOWL'
def speak(a:Union[Dog, Cat], quietly: bool) -> None:
print(a.talk(quietly))
你可能已經注意到了,類型提示位于冒號和箭頭之后。注意它傳遞的額外信息。現在我們一眼就能看到speak期望Dog或Cat,而布爾值標記指明是否應該小聲說話(返回小寫字母)。如果我們期望將來有更多說話者的類型,那么這種寫法會變得累贅嗎?會,但這大概意味著我們應該引入基類。
沒有類型提示,基本上很難編寫不言自明(self-documenting)的代碼。你將不得不重度依賴極好的命名,一絲不茍的注釋,還有代碼的清潔程度。這其實是相當高的門檻。
一個額外的好處是,PyCharm等許多IDE支持類型提示,如果你沒有傳入恰當的參數,會通過下劃曲線標出錯誤。
我強烈建議在新代碼中使用類型提示,接著逐漸更新老代碼。它們不僅為你節省了一些閱讀代碼的時間,更重要的是減輕了記住你所有的變量應該是什么類型的心智負擔。
如果你想了解更多關于類型提示的內容,請查看python文檔。升級到Python 3.6后我們在Feedly強調了類型提示的重要性,后來我收到了這么一條slack消息:
(譯文:加入feedly前我并不知道python有類型提示。有了類型提示,閱讀其他人的代碼要容易太多!)
一切如你所想地工作的時候,感覺真不錯。
-
代碼
+關注
關注
30文章
4801瀏覽量
68735 -
編譯器
+關注
關注
1文章
1636瀏覽量
49172 -
python
+關注
關注
56文章
4799瀏覽量
84810
原文標題:給Python加上額外的類型提示值得嗎?
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論