--- description: 對 Python 程式碼進行全面審查,包含 PEP 8 規範、型別提示、安全性及 Python 慣用法。此指令會呼叫 python-reviewer agent。 --- # Python 程式碼審查 (Python Code Review) 此指令會呼叫 **python-reviewer** agent 來進行針對 Python 語言特性的全面審查。 ## 此指令的功能 1. **識別 Python 變更**:透過 `git diff` 找出修改過的 `.py` 檔案。 2. **執行靜態分析**:執行 `ruff`, `mypy`, `pylint`, `black --check`。 3. **安全掃描**:檢查是否存在 SQL 注入、指令注入、不安全的反序列化。 4. **型別安全審查**:分析型別提示 (Type hints) 與 mypy 錯誤。 5. **Pythonic 檢查**:驗證程式碼是否遵循 PEP 8 與 Python 最佳實踐。 6. **產生報告**:按嚴重程度對問題進行分類。 ## 何時使用 在以下情況使用 `/python-review`: - 撰寫或修改 Python 程式碼後。 - 提交 Python 變更前。 - 審查包含 Python 程式碼的 Pull Request 時。 - 進入新的 Python 專案庫時。 - 學習 Pythonic 模式與慣用法時。 ## 審查類別 ### 關鍵問題 (CRITICAL - 必須修復) - SQL/指令注入漏洞。 - 不安全的 `eval()`/`exec()` 使用。 - Pickle 不安全的反序列化。 - 硬編碼的憑據。 - YAML 不安全的 `load()` (應使用 `safe_load()`)。 - 隱藏錯誤的空 `except` 區塊。 ### 高優先級 (HIGH - 建議修復) - 公共函式缺少型別提示。 - 使用可變物件作為預設參數 (Mutable default arguments)。 - 靜默吞掉異常 (Swallowing exceptions)。 - 資源使用未採用上下文管理器 (Context managers)。 - 使用 C 風格迴圈而非列表推導式 (Comprehensions)。 - 使用 `type()` 而非 `isinstance()`。 - 無鎖機制下的競態條件。 ### 中優先級 (MEDIUM - 考慮調整) - 違反 PEP 8 格式規範。 - 公共函式缺少 Docstrings。 - 使用 `print` 語句而非 `logging`。 - 低效的字串操作。 - 未使用具名常數的魔術數字 (Magic numbers)。 - 未使用 f-strings 進行格式化。 - 不必要的列表建立。 ## 執行的自動化檢查 ```bash # 型別檢查 mypy . # Lint 與格式檢查 ruff check . black --check . isort --check-only . # 安全掃描 bandit -r . # 依賴項稽核 pip-audit safety check # 測試 pytest --cov=app --cov-report=term-missing ``` ## 使用範例 ```text 使用者:/python-review Agent: # Python 程式碼審查報告 ## 審查檔案 - app/routes/user.py (已修改) - app/services/auth.py (已修改) ## 靜態分析結果 ✓ ruff: 無問題 ✓ mypy: 無錯誤 ⚠️ black: 2 個檔案需要重新格式化 ✓ bandit: 無安全問題 ## 發現問題 [CRITICAL] SQL 注入漏洞 檔案: app/routes/user.py:42 問題: 使用者輸入直接插入 SQL 查詢字串 ```python query = f"SELECT * FROM users WHERE id = {user_id}" # 錯誤 ``` 修復方案: 使用參數化查詢 ```python query = "SELECT * FROM users WHERE id = %s" # 正確 cursor.execute(query, (user_id,)) ``` [HIGH] 可變預設參數 (Mutable default argument) 檔案: app/services/auth.py:18 問題: 可變預設參數會導致狀態共享 ```python def process_items(items=[]): # 錯誤 items.append("new") return items ``` 修復方案: 使用 None 作為預設值 ```python def process_items(items=None): # 正確 if items is None: items = [] items.append("new") return items ``` [MEDIUM] 缺少型別提示 檔案: app/services/auth.py:25 問題: 公共函式缺少型別註解 ```python def get_user(user_id): # 錯誤 return db.find(user_id) ``` 修復方案: 加入型別提示 ```python def get_user(user_id: str) -> Optional[User]: # 正確 return db.find(user_id) ``` [MEDIUM] 未使用上下文管理器 檔案: app/routes/user.py:55 問題: 發生異常時檔案未關閉 ```python f = open("config.json") # 錯誤 data = f.read() f.close() ``` 修復方案: 使用 context manager ```python with open("config.json") as f: # 正確 data = f.read() ``` ## 摘要 - CRITICAL: 1 - HIGH: 1 - MEDIUM: 2 建議: ❌ 在修復 CRITICAL 問題前,禁止合併 (Block merge) ## 所需格式化 請執行:`black app/routes/user.py app/services/auth.py` ``` ## 核准標準 | 狀態 | 條件 | |--------|-----------| | ✅ 核准 (Approve) | 無 CRITICAL 或 HIGH 問題 | | ⚠️ 警告 (Warning) | 僅存在 MEDIUM 問題 (謹慎合併) | | ❌ 阻斷 (Block) | 發現 CRITICAL 或 HIGH 問題 | ## 與其他指令的整合 - 先使用 `/tdd` 確保測試通過。 - 對於非 Python 特有的通用問題,請使用 `/code-review`。 - 在提交前使用 `/python-review`。 - 若靜態分析工具失敗,則使用 `/build-fix`。 ## 框架特定審查 ### Django 專案 審查者會檢查: - N+1 查詢問題 (應使用 `select_related` 與 `prefetch_related`)。 - 模型變更但缺少 Migrations。 - 在能使用 ORM 時使用了原生 SQL。 - 多步驟操作缺少 `transaction.atomic()`。 ### FastAPI 專案 審查者會檢查: - CORS 配置錯誤。 - 使用 Pydantic 模型進行請求驗證。 - 回應模型 (Response models) 的正確性。 - 正確使用 async/await。 - 依賴注入模式。 ### Flask 專案 審查者會檢查: - 上下文管理 (App context, Request context)。 - 正確的錯誤處理。 - Blueprint 結構組織。 - 配置管理。 ## 相關參考 - Agent: `agents/python-reviewer.md` - 技能: `skills/python-patterns/`, `skills/python-testing/` ## 常見修復方法範例 ### 加入型別提示 ```python # 修復前 def calculate(x, y): return x + y # 修復後 from typing import Union def calculate(x: Union[int, float], y: Union[int, float]) -> Union[int, float]: return x + y ``` ### 使用上下文管理器 ```python # 修復前 f = open("file.txt") data = f.read() f.close() # 修復後 with open("file.txt") as f: data = f.read() ``` ### 使用列表推導式 (List Comprehensions) ```python # 修復前 result = [] for item in items: if item.active: result.append(item.name) # 修復後 result = [item.name for item in items if item.active] ``` ### 修正可變預設參數 ```python # 修復前 def append(value, items=[]): items.append(value) return items # 修復後 def append(value, items=None): if items is None: items = [] items.append(value) return items ``` ### 使用 f-strings (Python 3.6+) ```python # 修復前 name = "Alice" greeting = "Hello, " + name + "!" greeting2 = "Hello, {}".format(name) # 修復後 greeting = f"Hello, {name}!" ``` ### 修正迴圈中的字串拼接 ```python # 修復前 result = "" for item in items: result += str(item) # 修復後 result = "".join(str(item) for item in items) ``` ## Python 版本相容性 審查者會指示程式碼何時使用了較新版本的特性: | 特性 | 最低 Python 版本 | |---------|----------------| | 型別提示 (Type hints) | 3.5+ | | f-strings | 3.6+ | | 海象運算子 (Walrus operator `:=`) | 3.8+ | | 僅限位置參數 (Position-only) | 3.8+ | | Match 語句 | 3.10+ | | 型別聯集 (Type unions `x | None`) | 3.10+ | 請確保您的 `pyproject.toml` 或 `setup.py` 指定了正確的最低 Python 版本。