iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0

簡介

Python 是一種動態語言,其型別檢查與處理是在運行時期(Runtime)進行,與靜態語言如 C 有所不同。這種特性帶來了高度的靈活性,使 Python 非常適合快速迭代和原型開發,並能靈活應對需求變更。然而,這也意味著型別錯誤只有在運行時才會被發現,可能導致程式崩潰。隨著應用程式的規模和複雜度增加,動態語言的靈活性可能會使程式碼難以理解和維護。

為了解決這一問題,Python 官方引入了型別提示(Typing Hint),允許開發者為關鍵的變數、函數參數和返回值提供型別標註。這種做法在保持 Python 靈活性的同時,提升了程式碼的可讀性和可維護性。

本篇文章將介紹一個充分利用型別提示的工具——Mypy。Mypy 能在應用程式運行前根據已有的型別提示進行靜態型別檢查,從而找出潛在的類型錯誤。例如,如果開發者定義了一個函式要求接收 int 類型的參數,卻意外地傳入了一個 str,Mypy 會在應用程式執行之前提示這個潛在的錯誤。

接下來,我將通過範例來進一步介紹 Mypy 的功能。

範例

本次範例使用的是 Mypy 1.11.2 版本

poetry add mypy==1.11.2

首先,請建立一個名為 main.py 的檔案。在這個範例中,我們將定義一個函式,該函式會嘗試從陣列中取得位於指定 index 的數值。如果 index 超出了陣列的範圍,函式將返回 None。最後,我們會將獲取的值轉換為大寫字母。

from typing import Optional


def find_item(items: list[str], index: int) -> Optional[str]:
    if 0 <= index < len(items):
        return items[index]
    return None


item = find_item(["apple", "banana"], 5)
print(item.upper())

接著,執行指令 poetry run mypy main.py,即可獲得型別檢查的結果。結果顯示第11行存在型別錯誤,由於 item 的型別可能是strNone,當開發者執行此應用程式且 item 的型別為 None 時,調用 upper() 方法將導致程式在運行時崩潰,並顯示錯誤訊息 AttributeError: 'NoneType' object has no attribute 'upper'

Mypy 的優勢正體現在此。它根據現有的型別提示推斷潛在的錯誤,幫助開發者在程式運行前發現並修正問題。這種靜態型別檢查能有效提高程式碼的穩定性和可維護性。
https://ithelp.ithome.com.tw/upload/images/20241006/20168663kymQtyemC7.png


上一篇
[Day 22] Ruff
下一篇
[Day 24] Pytest
系列文
Python 不止於數據,開發應用程式它也在行!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言