Python 類型註解提示詞:給老代碼補類型註解 + 修復 mypy / pyright 報錯(不靠 Any 糊過去)

想給沒有類型註解的 Python 項目逐步加上類型、或者 mypy、pyright 報了一堆錯不知道怎麼改時用:AI 按代碼實際行為補註解,逐條解釋報錯原因,給出正確的修法,並說明哪些地方應該用 Protocol、TypedDict、泛型,而不是到處寫 Any 或忽略註釋。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
你是一名精通 Python 類型系統的工程師。請幫我處理類型註解。

- Python 版本:[如 3.12]
- 類型檢查工具與嚴格程度:[類型檢查工具與嚴格程度](例:mypy --strict、pyright basic)
- 任務:[給代碼補註解/修復報錯/兩者都要]
- 代碼:
  [粘貼代碼]
- 類型檢查器的報錯(如果有,原樣粘貼):
  [粘貼報錯]

補註解時:
1. 根據代碼的實際用法推斷類型,而不是根據變量名猜。推斷不出來的標註「需確認」,說明可能的幾種類型。
2. 使用當前 Python 版本支持的寫法:內置泛型(如 list 加類型參數)、用豎線表示聯合類型、可選值寫成「某類型或 None」。
3. 結構化的字典優先用 TypedDict 或數據類;只關心「有某個方法」的參數用 Protocol;容器和函數之間存在類型關聯時用泛型(TypeVar 或新的泛型語法,說明版本要求)。
4. 第三方庫沒有類型資訊時,說明有沒有對應的類型存根包可以安裝。

修復報錯時,對每一條:
1. 用通俗的話解釋報錯在說什麼。
2. 判斷這是真實的潛在 Bug(例如可能是 None 卻直接調用方法),還是類型標註寫得不夠準確。
3. 給出修法,優先順序:修正代碼邏輯(如增加 None 判斷)→ 修正類型標註 → 用類型收窄 → 最後才考慮 cast;不要用 Any 或忽略註釋掩蓋問題,確實需要時說明理由。

輸出:修改後的完整代碼,以及一張「報錯 → 原因 → 修法」的對照表;指出修復過程中發現的真實 Bug。

高亮處換成你自己的內容:[如 3.12]、[類型檢查工具與嚴格程度]、[給代碼補註解/修復報錯/兩者都要]、[粘貼代碼]、[粘貼報錯]

ChatGPT Plus 充值

已被複製 0 次

使用說明

怎麼填變量:[Python 版本] 決定了能用的寫法,比如 3.10 以上才能用豎線寫聯合類型,3.12 才支持新的泛型語法。[類型檢查工具與嚴格程度] 不同工具、不同模式的報錯差別很大,寫清楚才能對應上。

常見坑:

  • 為了讓報錯消失到處加 Any 或忽略註釋,類型檢查就形同虛設了。很多「可能為 None」的報錯其實是真實存在的 Bug。
  • 用 dict 加 Any 描述所有字典。結構固定的數據(例如接口返回)用 TypedDict 或數據類,鍵名寫錯時檢查器能直接發現。
  • 一次性給整個項目加嚴格模式,幾千條報錯沒法處理。先在新代碼和核心模組上開啟,逐步擴大範圍。

追問技巧:追問「這個項目想逐步開啟嚴格檢查,給出分階段的 mypy 配置方案(哪些模組先嚴格、哪些先放寬)」。

示例輸出

示例,僅供參考(節選)
報錯原因修法
Item "None" of "User \None" has no attribute "email"find_user() 找不到時返回 None,調用處直接取屬性
Incompatible return value type (got "dict[str, object]")返回值是結構固定的字典改為 TypedDict
python
from typing import TypedDict

class OrderSummary(TypedDict):
    order_id: str
    total_cents: int
    paid: bool

def summarize(order_id: str) -> OrderSummary:
    user = find_user(order_id)
    if user is None:
        raise LookupError(f"訂單 {order_id} 沒有關聯用戶")
    return {"order_id": order_id, "total_cents": user.balance_cents, "paid": True}

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~