Python作為一門動(dòng)態(tài)語言,其變量的類型可以自由變化。這個(gè)特性提高了代碼的開發(fā)效率,卻也增加了閱讀代碼和維護(hù)代碼的難度。
假設(shè)有一個(gè)變量is_request_finished,從名字上來看,這個(gè)變量的值應(yīng)該為True或者False,在寫代碼的時(shí)候,最初也確實(shí)是這樣定義的。但是可能由于某些原因,在某一次賦值的時(shí)候,is_request_finished = 'True'。此時(shí),如果代碼的單元測試不夠完善,那么if is_request_finished在is_request_finished = True和is_request_finished = 'True'的時(shí)候都成立,問題被隱藏了。但是當(dāng)is_request_finished = 'False'的時(shí)候,由于'False'作為一個(gè)非空字符串,就會(huì)使得if is_request_finished依然成立,從而使程序的行為發(fā)現(xiàn)異常。
單個(gè)變量的類型異常也許還容易發(fā)現(xiàn),但是如果變量是放在字典或者列表里面,那就比較麻煩了。假設(shè)需要保存一段個(gè)人信息,于是創(chuàng)建了下面這樣一個(gè)列表套字典的數(shù)據(jù)結(jié)構(gòu):
這種方式開發(fā)起來非常的快速而方便,但是其他人甚至是開發(fā)者自己在一段時(shí)間以后讀代碼,都會(huì)有一種想抽死自己的沖動(dòng)。因?yàn)楦静恢肋@個(gè)變量里面保存的是什么東西。
針對(duì)以上問題,常見的解決辦法有三種。
Type Hints 與 Variable Annotations
在PEP 484中,引入了Type Hints,在PEP 526中引入了Variable Annotations。它使得Python 3.6及以后的Python 代碼擁有了“聲明”變量類型的能力。這里的“聲明”之所以會(huì)打引號(hào),是因?yàn)檫@個(gè)聲明是給IDE和人看的。這個(gè)聲明對(duì) Python 的解釋器無效。
Type Hints
PyCharm現(xiàn)在已經(jīng)可以比較好地支持Type Hints了。例如下面這一段代碼:
模擬一段上傳文件的函數(shù),上傳成功以后返回True。接收一個(gè)參數(shù)url。在正常情況下,這個(gè)url應(yīng)該是一個(gè)字符串。于是,使用Type Hints,代碼可以變?yōu)椋?/p>
如果直接運(yùn)行,其運(yùn)行效果如下圖所示:
現(xiàn)在假設(shè)傳遞一個(gè)不是字符串的變量給upload函數(shù),此時(shí)PyCharm就會(huì)提示類型有問題,如下圖所示:
但提示歸提示,強(qiáng)行運(yùn)行也是沒有問題的。這就說明Type Hints主要是給IDE和人用的,解釋器并不會(huì)關(guān)心類型正不正確。
如果修改這個(gè)函數(shù)的返回值,讓它不返回True或者False,PyCharm 也會(huì)發(fā)出警告:
Type Hints的官方文檔,可以參閱:typing —Support for type hints
Variable Annotations
對(duì)于Variable Annotations,如下圖所示,雖然目前PyCharm還不能很好地提示變量類型不對(duì),但是人在讀代碼的時(shí)候,還是會(huì)起到一定的幫助。
除了這種寫法外,Variable Annotations還支持把類型寫在注釋中,如下圖所示:
雖然PyCharm不能起到很好的提示作用,但是可以使用一個(gè)第三方庫mypy來對(duì)代碼做靜態(tài)檢查,其運(yùn)行效果如下圖所示,可以發(fā)現(xiàn)賦值的類型與聲明的類型不一致(expression has type “str”, variable has type “bool”, 表達(dá)式的類型為“str”,變量的類型是“bool”)。
關(guān)于Variable Annotations的更多用法,可以參閱:Syntax for Variable Annotations關(guān)于Mypy,可以參閱它的官方文檔。
docstring
在docstring來標(biāo)注變量的類型,如下圖所示:
這種寫法可以用來提示一個(gè)函數(shù),或者一個(gè)類它里面的各個(gè)變量的情況。但是詳細(xì)程度需要看開發(fā)者有沒有耐心把這個(gè)注釋寫清楚。
Bean
這種方法來自與Java Bean的思想,它主要用來解決列表套字典,字典套字典,字典套列表,列表套列表這種深層的嵌套關(guān)系。
-
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
40230 -
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28465 -
python
+關(guān)注
關(guān)注
56文章
4807瀏覽量
85037
原文標(biāo)題:Python變量很難記?記住變量類型的三種方式
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論