Python 中的型別提示
- 什麼是 Python 中的型別提示
- 如何向 Python 變數新增型別提示
- 在 Python 中如何為函式新增型別提示(函式註解)
- Python 中的打字模組
-
在 Python 中如何通過
mypy
庫使用型別提示 - 在 Python 中為什麼我應該使用型別提示
- 在 Python 中為什麼我應該避免使用型別提示
- 在 Python 中如何使用型別註釋
- まとめ
型別提示是 Python 3.5 釋出的一項新功能,它允許你在程式碼中靜態指示變數的資料型別。
Python 語言是動態型別的,在特定情況下會導致錯誤,並在較長的程式中導致不必要的編碼問題。
由於 Python 語言的動態特性,推斷或檢查物件的型別很困難,這可以通過 Python 的型別提示來解決。
什麼是 Python 中的型別提示
在 Python 中為使用者指定新概念中的資料型別。資料型別是 C、C++ 和 Java 中的一個流行概念。
這種程式語言的靜態特性意味著編譯器在執行程式碼之前執行型別檢查。
Python 的動態特性意味著它是在執行時編譯的。PEP 484
在 Python 中引入了型別提示,用於對程式碼進行靜態型別檢查。Python 中的型別提示定義了變數的資料型別和函式的返回型別。
如何向 Python 變數新增型別提示
你可以通過以下方式宣告變數後跟:
和資料型別來快速向變數新增型別提示。你也可以在提及資料型別後初始化變數的值。
val1: float = 4.71
print(val1)
val2: str = "Example of String"
print(val2)
val3: bool = True
print(val3)
lis1: list = ["p", "q", "r"]
print(lis1)
tup1: tuple = (47, 55, 30)
print(tup1)
dic1: dict = {"John": 98, "Frank": 99, "Lisa": 100}
print(dic1)
輸出:
4.71
Example of String
True
['p', 'q', 'r']
(47, 55, 30)
{'John': 98, 'Frank': 99, 'Lisa': 100}
在 Python 中如何為函式新增型別提示(函式註解)
你可以通過在變數後新增 :
並指定資料型別來輕鬆地向任何函式新增型別提示。你可以通過以下方式定義函式後新增 ->
來指定返回資料型別。
def product(no1: int, no2: int) -> int:
return no1 * no2
print(product(6, 4))
輸出:
24
Python 3.0 中提供了函式註解,型別提示使用這些註解為方法提供返回值。新增返回資料型別不會阻礙函式的執行。
你可以將 None
用於不返回任何內容的函式。你可以使用 typing
模組中的 Union
來指定多個資料型別。
Python 中的打字模組
在 Python 中,型別提示通過 Python 3.5 中引入的 typing
模組提供了更多的功能。Python 的 typing
模組允許你明確指定資料型別。
你可以定義整數的元組
,浮點數的列表
,並且更有效,如下所示。
from typing import List, Tuple, Dict
lis1: List[int] = [70, 18, 29]
print(lis1)
tup1: Tuple[float, int, int] = (21.52, 2, 3)
print(tup1)
dic1: Dict[int, str] = {1: "Type Hints", 2: "Python"}
print(dic1)
輸出:
[70, 18, 29]
(21.52, 2, 3)
{1: 'Type Hints', 2: 'Python'}
typing
模組提供對型別提示的支援,包括:
型別別名
Type Aliases 允許你指定一個單詞,你可以將其交替用作別名以簡化程式碼,如圖所示。
Vector = List[float]
NewType
NewType
輔助類可以很容易地發現邏輯缺陷。
RollNo = NewType("RollNo", int)
泛型
抽象基類已得到增強,以支援訂閱以指示容器元件的預期型別,因為容器中儲存的物件的型別資訊不能一般地靜態推斷。
X = TypeVar("X")
Any
型別
Any
型別是與其他所有型別相容的特殊資料型別。當你的程式碼需要動態和靜態行來指示變數需要動態型別的值時,使用任何
。
x: Any = "Python"
Union
Union
運算子允許你在不顯示任何警告的情況下接受和返回指定的資料型別。你還可以使用 Union
運算子在 Python 中選擇一種以上的資料型別。
def numsqr(n1: Union[float, int]) -> Union[float, int]:
return n1 ** 2
你可以在 Python 3.10 及更新版本中使用|
輕鬆定義 Union,如下所示。
def numsqr(n1: float | int) -> float | int:
return n1 ** 2
在 Python 中如何通過 mypy
庫使用型別提示
Python 的 mypy
庫允許你在執行時強制進行型別檢查。PEP 484
不強制使用型別提示的任何約束,僅提供執行型別檢查要遵循的指示和指南。
無論註釋或型別提示的數量或存在如何,所有程式碼片段都可以順利執行,因為 Python 不使用它們。你可以使用 pip
或 conda
安裝 mypy
庫。
pip install mypy
conda install mypy
使用 mypy
庫可以通過執行型別檢查和在執行時發出警告來幫助你更輕鬆地編碼。Mypy
引發警告,解釋在特定行中資料型別的錯誤使用,如下所示。
def findsqr(n1: int) -> int:
return n1 ** 2
if __name__ == "__main__":
print(findsqr(4))
print(findsqr(4.5))
沒有 mypy
的輸出:
16
20.25
使用 mypy
輸出:
main.py:5: error: Argument 1 to "findsqr" has incompatible type "float"; expected "int"
Found 1 error in 1 file (checked 1 source file)
在 Python 中為什麼我應該使用型別提示
Python 的 mypy
庫和型別提示為開發人員提供了一些好處,包括:
- 程式碼文件 - 型別提示可以更好地記錄你的程式碼,因此引用它的其他人可以快速獲取它,因為已經指定了變數和函式的資料型別。
- 增加 IDE 和工具支援 - 如果你在程式碼中使用了型別提示,IDE(整合開發環境)可以提供更好的程式碼完成建議、方法和屬性。
- 輕鬆除錯 - Python 中的型別提示使查詢和糾正錯誤更容易,因為 mypy 可以查明錯誤的確切位置。型別提示還為大型專案中的大程式碼塊建立了一個乾淨的流程,提供了更原始的架構。
在 Python 中為什麼我應該避免使用型別提示
Python 的型別提示為開發人員提供了許多優點,但也有一些缺點,例如:
- 增加編碼 - 額外的程式碼行,特別是包含變數的程式碼,將包含在型別提示中,從而導致更大的工作量和程式碼長度。
- 不支援的版本 - 型別提示為 Python 3.5 或更高版本提供了出色的體驗,因為舊版本的 Python(Python 3 之前)不執行變數註釋。型別註釋可以在舊版本的 Python 中使用,以使用變數註釋和型別提示。
在 Python 中如何使用型別註釋
Python 中的型別註釋是特殊註釋,允許你使用註釋字典中不可用的註釋在舊版本中新增型別提示。
型別註釋的語法如下。
def circle_area(r):
# type: (float) -> float
return 3.14 * r * r
如上所示,你可以在舊版本中新增型別註釋作為折衷方案,但 Python 建議使用型別提示。
まとめ
我們在本文中討論了 Python 中的 Type Hints 和型別化模組。型別提示通過提供靜態程式碼檢查來提供其他程式語言的優勢。
Python 中的型別提示是改進程式碼文件和可讀性的絕佳方式。型別提示在除錯程式碼時也能極大地幫助你並讓其他人很好地理解它。
但是,型別提示會使你的程式碼更長,這是可以避免的,因為 Python 以其簡潔明瞭的結構而聞名。
型別提示提供了一種更簡潔的編碼方法,並允許你更好地定義程式碼和功能的體系結構。