Python 模組與套件(Modules & Packages)
主題:import / from import
簡介
在 Python 中,模組(module)與套件(package)是組織程式碼的基礎。透過 import 與 from … import …,我們可以把大型程式切分成易於維護、可重複使用的單元。對於初學者而言,掌握正確的匯入方式不僅能避免命名衝突,還能提升執行效能;對於中級開發者,則是打造可擴充專案架構的關鍵。
本篇文章將從概念說明、實作範例、常見陷阱與最佳實踐,逐層帶你深入了解 import 與 from import 的用法,並提供實務上的應用情境,幫助你在日常開發中更加得心應手。
核心概念
1. 為什麼需要 import?
Python 的執行環境在啟動時只會載入內建的模組(如 sys、math),其他功能必須透過 匯入 的方式取得。這樣的設計讓標準函式庫保持輕量,同時讓開發者可以自行建立或安裝第三方套件。
2. 基本語法
| 方式 | 語法 | 說明 |
|---|---|---|
| 完整匯入 | import module_name |
匯入整個模組,使用時需加上模組名稱前綴(module_name.function())。 |
| 別名匯入 | import module_name as alias |
為模組指定別名,常用於縮短名稱(import numpy as np)。 |
| 選擇匯入 | from module_name import name1, name2 |
只匯入指定的名稱,直接使用(name1())。 |
| 別名選擇匯入 | from module_name import name as alias |
為匯入的名稱指定別名(from math import sqrt as square_root)。 |
| 全部匯入 | from module_name import * |
匯入模組內所有公開名稱(不建議在大型專案使用)。 |
程式碼範例
範例 1:完整匯入標準模組
# 匯入整個 math 模組
import math
# 使用模組內的函式
radius = 5
area = math.pi * radius ** 2
print(f"圓面積 = {area}")
說明:使用
math.前綴可以清楚知道pi與sqrt來源於哪個模組,避免命名衝突。
範例 2:別名匯入第三方套件
# 匯入 pandas 並給予別名 pd
import pandas as pd
# 讀取 CSV 檔案
df = pd.read_csv("sales.csv")
print(df.head())
說明:
pandas常以pd為別名,讓程式碼更簡潔且符合社群慣例。
範例 3:選擇匯入特定函式
# 只匯入 sqrt 與 pow
from math import sqrt, pow
print(sqrt(16)) # 4.0
print(pow(2, 8)) # 256.0
說明:僅匯入需要的名稱,可減少記憶體佔用,也讓 IDE 更容易提供自動完成。
範例 4:別名選擇匯入
# 為 sqrt 設定別名 sq
from math import sqrt as sq
print(sq(81)) # 9.0
說明:當名稱過於常見或與本地變數衝突時,使用別名可提升可讀性。
範例 5:自訂模組與套件的匯入
假設專案目錄如下:
my_project/
│
├─ utils/
│ ├─ __init__.py
│ └─ file_helper.py
└─ main.py
file_helper.py 內容:
# utils/file_helper.py
def read_text(path):
with open(path, "r", encoding="utf-8") as f:
return f.read()
在 main.py 中匯入:
# main.py
from utils.file_helper import read_text
content = read_text("data.txt")
print(content)
說明:
__init__.py使utils成為套件,透過from utils.file_helper import …可以直接取得子模組的函式。
常見陷阱與最佳實踐
| 陷阱 | 可能的問題 | 解決方式 |
|---|---|---|
使用 from module import * |
名稱污染、難以追蹤來源、IDE 無法自動完成 | 盡量改用 明確匯入(from module import name1, name2) |
| 同名變數遮蔽 | 匯入後本地變數被覆寫,導致錯誤 | 使用 別名(import numpy as np)或 限定名稱(module.name) |
| 相對匯入錯誤 | 在腳本直接執行時 ImportError |
以 絕對路徑匯入或使用 python -m package.module 方式執行 |
| 循環匯入(A 依賴 B,B 也依賴 A) | 程式在載入階段拋出 ImportError |
重構程式,將共同依賴抽離到獨立模組,或延遲匯入(在函式內部 import) |
未加入 __all__ |
from package import * 時匯入過多不必要名稱 |
在 __init__.py 中定義 __all__ = ["module1", "module2"] 以控制公開介面 |
最佳實踐
- 明確匯入:除非確定不會產生衝突,否則避免
*匯入。 - 遵守命名慣例:第三方套件如
numpy、pandas、matplotlib都有慣用別名,保持一致性。 - 模組層級分離:將常用工具放在
utils、helpers等子套件,讓主程式保持乾淨。 - 使用相對匯入(
from . import …)只在套件內部,外部腳本請使用絕對匯入。 - 檢查循環依賴:使用
import時,先檢視檔案之間的依賴圖,必要時將共用程式碼抽成獨立模組。
實際應用場景
資料科學專案
- 只匯入
pandas.read_csv、numpy.mean等常用函式,以減少程式碼雜訊。 - 透過別名
np、pd提升腳本可讀性。
- 只匯入
Web 後端開發(Flask / Django)
- 在
app/__init__.py中匯入藍圖(Blueprint)或路由模組,保持主程式run.py簡潔。 - 例如:
from .views import user_bp。
- 在
CLI 工具
- 使用
if __name__ == "__main__":結構,將主要執行邏輯放在main(),其他功能放在獨立模組,透過from .core import parse_args呼叫。
- 使用
大型套件開發
- 在套件根目錄的
__init__.py中定義__all__,只暴露必要的 API,讓使用者import mypkg後得到乾淨的介面。
- 在套件根目錄的
總結
import 與 from import 是 Python 模組化的核心機制。透過完整匯入、別名匯入、選擇匯入等多樣方式,我們可以在保持程式碼可讀性、降低耦合度的同時,提升執行效能與維護性。掌握以下要點,即可避免常見陷阱:
- 避免
*匯入,改用明確列出名稱。 - 善用別名,防止命名衝突並遵循社群慣例。
- 注意循環依賴,必要時將共用程式碼抽離。
- 在套件內使用相對匯入,在應用層使用絕對匯入。
只要遵循這些最佳實踐,你就能在 Python 專案 中自由、有效地組織與重用程式碼,為未來的功能擴充奠定堅實基礎。祝你寫程式愉快,模組管理更上一層樓!