![](../../img/interpret.jpg)
Python 簡易手冊
單元 9 - 型態標記
Python 的變數 (variable) 是直接用等號就可以設定數值 (value) ,該變數也會自動設定為數值的資料型態 (data type) ,變數也允許不限制資料型態的種類,這意思是說,只要變數重新指派 (assignment) 就自動轉換成除新指派後數值的資料型態。
由於很多時候,變數以及函數 (function) 、方法 (method) 的參數 (parameter) 與回傳值 (return value) 都是處理特定型態的數值,因此變數在型態上可變性就變成不具有程式碼的易讀性,因此 Python 3.5 之後可以對變數、參數與回傳值進行型態標記 (type hint) ,然後可以藉由第三方工具 mypy 檢查程式碼中標記的型態與實際套用是否相符。
簡單舉一例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 標記變數 n 的型態 n: int # 標記函數的參數與回傳值的型態 def my_sum(n1: int, n2: float) -> int: return n1 + n2 # 進行實際計算 n = 3 print(my_sum(n + 1, n - 1)) # 檔名: hint_demo.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 4 月 |
先看到第 2 行,型態標記是在變數後加上冒號,冒號後為型態識別字 (identifier) ,這裡是把變數 n 標記為整數 int 型態
1 2 | # 標記變數 n 的型態 n: int |
然後第 5 行看到函數中參數與回傳值的型態標記方式,參數標記的方式跟變數一樣,至於回傳值是在小括弧後加上連接線與大於符號,然後加上型態名稱,最後再接冒號
4 5 | # 標記函數的參數與回傳值的型態 def my_sum(n1: int, n2: float) -> int: |
以上是把第一個參數 n1 標記為整數 int ,第二個參數 n2 標記成浮點數 float ,回傳值標記為整數 int 。
單元 44 - 函數與 return 陳述會詳細介紹如何定義函數,至於方法定義跟函數略同,單元 55 - 實體屬性與方法會介紹如何定義實體方法 (instance method) 。
至於 mypy 可以透過 pip 指令安裝,如下
> pip install mypy |
Collecting mypy Downloading mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl.metadata (1.9 kB) Collecting typing-extensions>=4.1.0 (from mypy) Downloading typing_extensions-4.11.0-py3-none-any.whl.metadata (3.0 kB) Collecting mypy-extensions>=1.0.0 (from mypy) Downloading mypy_extensions-1.0.0-py3-none-any.whl.metadata (1.1 kB) Downloading mypy-1.10.0-cp312-cp312-macosx_11_0_arm64.whl (9.9 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.9/9.9 MB 4.7 MB/s eta 0:00:00 Downloading mypy_extensions-1.0.0-py3-none-any.whl (4.7 kB) Downloading typing_extensions-4.11.0-py3-none-any.whl (34 kB) Installing collected packages: typing-extensions, mypy-extensions, mypy Successfully installed mypy-1.10.0 mypy-extensions-1.0.0 typing-extensions-4.11.0 |
> |
pip 指令式 Python 官方直譯器隨附安裝第三方程式庫 (third-party library) 的指令,單元 71 - 安裝第三方模組會進一步介紹使用方式。
使用 mypy 檢查檔案的型態標記就是直接在命令列輸入 mypy 指令,後面空一格接上檔案名稱,如下
> mypy hint_demo.py |
hint_demo.py:6: error: Incompatible return value type (got "float", expected "int") Found 1 error in 1 file (checked 1 source file) |
> |
這裡 mypy 檢查出第 6 行出錯,因為兩個參數分別是 int 及 float ,相加後會得到 float ,而非型態標記的 int 。
參考資料
- https://docs.python.org/3/library/typing.html
- https://peps.python.org/pep-0483/
- https://peps.python.org/pep-0484/
- https://docs.python.org/3/tutorial/controlflow.html#function-annotations
- https://mypy.readthedocs.io/en/stable/#
![](../../img/pydoing.gif)