def validate_input(data: str | int | float) -> str:
if isinstance(data, str):
if not data.strip():
raise ValueError("String cannot be empty")
return data
elif isinstance(data, (int, float)):
if data < 0:
raise ValueError("Number cannot be negative")
return str(data)
else:
raise TypeError("Unsupported input type")
def display_value(value: int | str) -> None:
print(value)
Any 型:
from typing import Any
def display_value(value: Any) -> None:
print(value)
Q2. Python 3.10 以前與以後的 Union 型是否相容?
是的,兩種寫法是相容的。Python 3.10 引入了新語法,但舊的 Union 寫法仍然可使用。
範例:相容的寫法
from typing import Union
# 舊語法
def old_union(data: Union[int, str]) -> None:
print(data)
# 新語法
def new_union(data: int | str) -> None:
print(data)
Q3. 型別提示會影響執行效能嗎?
不會。型別提示僅作為開發輔助資訊,在執行階段並不會影響程式的效能。它主要用於靜態分析工具與 IDE 的補全提示。 但若搭配像 mypy 這類工具,則有以下好處:
在撰寫階段就能提早發現錯誤。
強化 IDE 的智慧提示與補全功能,提高開發效率。
Q4. Optional 型與 Union 型有何不同?
Optional 型是 Union 型的一種特例,用來表示某個值可以是特定型別或 None。 Union 型範例:
def process_data(data: int | None) -> str:
return str(data) if data is not None else "No data"
Optional 型範例:
from typing import Optional
def process_data(data: Optional[int]) -> str:
return str(data) if data is not None else "No data"
Q5. 靜態分析工具是必要的嗎?
雖然不是強制使用,但非常建議搭配靜態分析工具,能顯著提升程式碼品質與維護效率。
原因如下:
幫助發現潛在錯誤。
提升除錯與開發速度。
在團隊開發中維持一致性。
推薦工具
mypy: 適合嚴格型別檢查。
Pyright: 提供快速且即時的型別分析。
mypy 使用範例
pip install mypy
mypy script.py
總結
本章 FAQ 針對 Union 型常見問題進行說明,包括它與 Any、Optional 的差異,以及靜態工具的實用性。
Union 型與 Any 用途不同,應根據需求選用。
新舊語法相容,開發階段可自由切換。
靜態分析工具有助於提升品質與安全性。
8. 推薦工具與函式庫
mypy:靜態型別檢查工具
什麼是 mypy? mypy 是一款支援 Python 型別提示的靜態分析工具,能夠驗證 Union 型等型別是否正確。
功能特色
在執行前發現型別錯誤。
協助大型專案維持高品質程式碼。
完全支援 Python 型別提示語法。
安裝方式
pip install mypy
使用範例
from typing import Union
def process_input(data: Union[int, str]) -> str:
return str(data)
process_input(100) # OK
process_input("hello") # OK
process_input(10.5) # 錯誤:型別不符
執行型別檢查
mypy script.py
Pyright:快速型別檢查工具
什麼是 Pyright? Pyright 是由 Microsoft 開發的 Python 型別檢查工具,特別適合與 VSCode 結合使用,可即時分析程式。
功能特色
高效且快速。
與 VSCode 整合流暢。
支援自動型別推論。
安裝方式
npm install -g pyright
使用範例
def validate_input(data: int | str) -> str:
if isinstance(data, int):
return str(data)
elif isinstance(data, str):
return data
return "Invalid input" # 檢查工具會偵測此問題
Pydantic:資料驗證與型別檢查
什麼是 Pydantic? Pydantic 是一款可根據型別提示進行資料驗證與序列化的函式庫,非常適合搭配 Union 型處理複雜資料結構。
功能特色
強大支援 JSON 與 API 驗證。
支援自動型別轉換。
能夠定義安全又清晰的資料模型。
安裝方式
pip install pydantic
使用範例
from pydantic import BaseModel
from typing import Union
class Item(BaseModel):
name: str
value: Union[int, float]
item = Item(name="example", value=42)
print(item)
IDE 支援:PyCharm 與 VSCode
現代 IDE 提供完善的型別提示與檢查功能,能提升 Union 型開發效率。
推薦 IDE
PyCharm: 強大的型別提示與警告功能,適合專業開發者。
VSCode: 搭配 Python 與 Pyright 外掛,提供輕量且快速的開發體驗。
總結
透過這些工具與函式庫,可以更有效地利用 Union 型,提升程式安全性與開發效率。 推薦工具整理:
mypy: 嚴格靜態型別檢查。
Pyright: 即時、快速型別分析。
Pydantic: 適合資料模型與驗證處理。
PyCharm / VSCode: 提供強大 IDE 支援。
9. 總結
Union 型的實用性與進化重點
本文從基礎到進階,完整介紹了 Python 中 Union 型的定義、應用與最佳實踐。 以下是本文重點整理:
基本概念:
Union 型可容納多種資料型別,提高靈活性與型別安全。
新舊語法差異:
Python 3.10 以前使用 Union[X, Y],以後可使用簡潔的 X | Y。
應用場景:
資料分析、API 回應處理、使用者輸入驗證等。
實踐建議:
配合靜態工具檢查型別。
善用型別別名提升可讀性。
建議使用 Python 3.10 以上版本開發
新語法不僅簡潔,還能提升維護效率與可讀性。以下是新語法範例:
def process_input(data: int | str) -> str:
return str(data)