當前位置:
首頁 > 知識 > Python變數很難記?記住變數類型的三種方式

Python變數很難記?記住變數類型的三種方式

可以啦,讓我們繼續相互陪伴。

文 /Kingname

Python作為一門動態語言,其變數的類型可以自由變化。這個特性提高了代碼的開發效率,卻也增加了閱讀代碼和維護代碼的難度。

假設有一個變數is_request_finished,從名字上來看,這個變數的值應該為True或者False,在寫代碼的時候,最初也確實是這樣定義的。但是可能由於某些原因,在某一次賦值的時候,is_request_finished = "True"。此時,如果代碼的單元測試不夠完善,那麼if is_request_finished在 is_request_finished = True 和 is_request_finished = "True"的時候都成立,問題被隱藏了。但是當is_request_finished = "False"的時候,由於"False"作為一個非空字元串,就會使得if is_request_finished 依然成立,從而使程序的行為發現異常。

單個變數的類型異常也許還容易發現,但是如果變數是放在字典或者列表裡面,那就比較麻煩了。假設需要保存一段個人信息,於是創建了下面這樣一個列表套字典的數據結構:

這種方式開發起來非常的快速而方便,但是其他人甚至是開發者自己在一段時間以後讀代碼,都會有一種想抽死自己的衝動。因為根本不知道這個變數裡面保存的是什麼東西。

針對以上問題,常見的解決辦法有三種。

Type Hints 與 Variable Annotations

在PEP 484中,引入了Type Hints,在PEP 526中引入了Variable Annotations。它使得Python 3.6及以後的Python 代碼擁有了「聲明」變數類型的能力。這裡的「聲明」之所以會打引號,是因為這個聲明是給IDE和人看的。這個聲明對 Python 的解釋器無效。

Type Hints

PyCharm現在已經可以比較好地支持Type Hints了。例如下面這一段代碼:

模擬一段上傳文件的函數,上傳成功以後返回True。接收一個參數url。在正常情況下,這個url應該是一個字元串。於是,使用Type Hints,代碼可以變為:

如果直接運行,其運行效果如下圖所示:

現在假設傳遞一個不是字元串的變數給upload函數,此時PyCharm就會提示類型有問題,如下圖所示:

但提示歸提示,強行運行也是沒有問題的。這就說明Type Hints主要是給IDE和人用的,解釋器並不會關心類型正不正確。

如果修改這個函數的返回值,讓它不返回True 或者False,PyCharm 也會發出警告:

Type Hints的官方文檔,可以參閱:typing — Support for type hints

Variable Annotations

對於Variable Annotations,如下圖所示,雖然目前PyCharm還不能很好地提示變數類型不對,但是人在讀代碼的時候,還是會起到一定的幫助。

除了這種寫法外,Variable Annotations還支持把類型寫在注釋中,如下圖所示:

雖然PyCharm不能起到很好的提示作用,但是可以使用一個第三方庫mypy來對代碼做靜態檢查,其運行效果如下圖所示,可以發現賦值的類型與聲明的類型不一致(expression has type 「str」, variable has type 「bool」, 表達式的類型為「str」,變數的類型是「bool」)。

關於Variable Annotations的更多用法,可以參閱:Syntax for Variable Annotations

關於Mypy,可以參閱它的官方文檔。

docstring

在docstring來標註變數的類型,如下圖所示:

這種寫法可以用來提示一個函數,或者一個類它裡面的各個變數的情況。但是詳細程度需要看開發者有沒有耐心把這個注釋寫清楚。

Bean

這種方法來自與Java Bean的思想,它主要用來解決列表套字典,字典套字典,字典套列表,列表套列表這種深層的嵌套關係。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員之家 的精彩文章:

走近後廠村程序員的真實生活:「拿命換錢」
一天能寫2000行代碼的實習生,到底是不是一個程序員的好苗子?

TAG:程序員之家 |