Python 程式碼審查:品質、安全與慣例
用途
對 Python 程式碼做系統化三級審查,找出邏輯錯誤、安全漏洞與風格問題,並按嚴重度排序給出修正建議,讓你在合併前有一道有結構的把關。
何時用
- 適合:完成新功能開發、修改既有 Python 程式碼後,提交合併前想要第二道把關時。
- 不要用:非 Python 語言的審查(請用通用版),或是需要重構建議而非品質審查的情境(請用「Python 重構建議產生器」)。
Prompt
text
請對以下 Python 程式碼做系統審查,依優先序分三級輸出:
🔴 Critical(必修)
- 邏輯錯誤(計算結果不正確、控制流有漏洞)
- 安全漏洞(SQL injection、hardcoded 密鑰、不安全的反序列化)
- 裸露的 bare except(except Exception: pass 類型)
🟡 Warning(建議修)
- 型別標注缺失或錯誤
- Pydantic model 使用不當(直接用 dict 而非 model)
- 命名不符 snake_case 慣例
- 未明確宣告的例外處理
🟢 Suggestion(可選)
- 可讀性改善
- 效能小優化
- 文件字串建議
審查規則:
- 套件管理必須用 uv,不接受 pip 直接呼叫
- Python 版本假設 3.11+,可使用 match-case、Self 等新語法
- 不允許 hardcoded 密鑰或憑證
程式碼:
{{Python 程式碼}}範例 / 變體
- 填好變數:把
{{Python 程式碼}}換成實際的函式或模組內容,例如貼上src/billing/invoice.py的完整內容。 - 變體(只看 Critical):在 prompt 末尾加「只輸出 🔴 Critical 問題,其餘略過」,適合趕時間的快速安全掃描。
- 變體(搭配 git diff 輸入):把
{{Python 程式碼}}換成「以下是這次 PR 的 git diff,只審查新增與修改的行」,讓範圍更聚焦。
🎯 範例輸出(實測)
在 Claude.ai 跑這句、把
{{Python 程式碼}}換成一段訂單處理模組的結果:
點開看 AI 實際輸出
測試輸入程式碼(src/orders/process.py 節錄):
text
import subprocess
API_KEY = "sk-prod-abcd1234efgh5678" # ECPay key
def process_order(order_id, amount):
try:
result = subprocess.run(f"./scripts/invoice.sh {order_id} {amount}", shell=True)
return result
except:
pass
def get_discount(price, rate):
return price * rate審查結果:
🔴 Critical(必修)
- 硬編碼 API Key:
API_KEY = "sk-prod-abcd1234efgh5678"— 金鑰洩漏風險,立即移至環境變數os.environ["ECPAY_API_KEY"] - Shell Injection:
subprocess.run(..., shell=True)搭配未清洗的order_id/amount參數,攻擊者可注入 shell 命令(例:order_id = "1; rm -rf /");改用subprocess.run(["./scripts/invoice.sh", order_id, str(amount)], shell=False) - Bare except:
except: pass吞掉所有例外,發票腳本失敗不會被偵測;改為except subprocess.CalledProcessError as e: logger.error("發票腳本失敗: %s", e)
🟡 Warning(建議修)
- 缺少型別標注:
process_order(order_id, amount)無型別,order_id: str,amount: Decimal應明確宣告 get_discount回傳值型別不明:price * rate若都是 float 會有精度問題,建議改Decimal
🟢 Suggestion(可選)
get_discount命名:rate語意模糊,改為discount_rate更清楚- 缺少 docstring:兩個函式都沒有說明,建議至少一行 summary
💡 實測心得:把審查規則裡的「套件管理必須用 uv」也帶進 prompt,AI 會額外檢查 pip install 呼叫;但若你的 codebase 有歷史 requirements.txt,建議在 prompt 裡說明一下,否則 AI 可能把整個 pip 生態都標成 Warning。
延伸
你有沒有遇過這種情況?PR review 時每個人盯的點不一樣,結果最明顯的 bare except 沒人抓到,合併進去之後線上才爆。三級分類的好處是讓 Critical 清楚跳出來,不會被 Suggestion 的雜訊淹沒。審查完如果發現需要大幅重構,可以接著用「Python 重構建議產生器」深挖結構問題。