💻使用 compile() 函數檢查 的方法~邱允文

 💻使用 compile() 函數檢查 的方法,因為它最適合用於純粹的語法檢查而不會產生副作用。

以下是詳細的解說、完整的程式碼範例以及三個測試案例。


💻 完整程式碼範例:使用 compile() 函數捕獲 SyntaxError

這個範例中,我們將定義一個名為 check_syntax 的函數,它接受一個程式碼字串作為輸入,並利用 Python 的 compile() 函數來判斷該字串的語法是否有效。

步驟解說 (Step-by-Step)

  1. 定義檢查函數 check_syntax(code_string)

    • 此函數接受一個參數 code_string,即我們想檢查的 Python 程式碼。

  2. 實作 try...except 結構:

    • 這是關鍵步驟。我們將嘗試執行可能拋出錯誤的程式碼放在 try 塊中。

  3. 呼叫 compile() 函數:

    • try 塊內,呼叫 compile(code_string, '<string>', 'exec')

      • '<string>' 是一個虛擬的檔案名。

      • 'exec' 模式允許我們檢查多行的、可執行的語句(例如函數定義、if 語句等)。

    • 如果語法正確, compile() 會返回一個程式碼物件,並執行 return True

  4. 捕獲 SyntaxError

    • 使用 except SyntaxError as e: 來專門捕獲語法錯誤。

    • 如果語法錯誤發生, 程式流程會跳轉到此處。我們將打印出錯誤的詳細訊息(如錯誤類型和行號),並執行 return False

  5. 測試案例: 準備三種不同情況的程式碼字串進行測試,並打印結果。

程式碼範例

Python
import sys

def check_syntax(code_string):
    """
    使用 compile() 函數檢查給定程式碼字串的 Python 語法是否正確。
    """
    print(f"--- 檢查以下程式碼片段 ---\n{code_string}")
    
    try:
        # 嘗試編譯程式碼。如果語法錯誤,將拋出 SyntaxError
        compile(code_string, '<string>', 'exec')
        
        # 如果編譯成功,則表示語法正確
        print("✅ 語法檢查結果:**正確**")
        return True
    
    except SyntaxError as e:
        # 捕獲語法錯誤 (SyntaxError)
        print("❌ 語法檢查結果:**錯誤**")
        print(f"   錯誤類型:{type(e).__name__}")
        print(f"   詳細訊息:{e}")
        # e.lineno 顯示錯誤發生的行號
        if hasattr(e, 'lineno'):
             print(f"   錯誤行號:第 {e.lineno} 行")
        return False
    except IndentationError as e:
        # 捕獲縮排錯誤 (IndentationError 是 SyntaxError 的子類,但分開捕獲更清晰)
        print("❌ 語法檢查結果:**縮排錯誤**")
        print(f"   錯誤類型:{type(e).__name__}")
        print(f"   詳細訊息:{e}")
        if hasattr(e, 'lineno'):
             print(f"   錯誤行號:第 {e.lineno} 行")
        return False
    except Exception as e:
        # 捕獲其他所有可能發生的異常(例如 NameError 等邏輯錯誤不會在此發生,因為沒有執行)
        print(f"⚠️ 發生其他錯誤:{type(e).__name__}")
        return False

# ----------------------------------------------------
# 測試案例
# ----------------------------------------------------

# 案例 1: 缺少冒號 (SyntaxError)
case_1_code = """
for i in range(10)  # 這裡缺少 ':'
    print(i)
"""

# 案例 2: 缺少縮排 (IndentationError)
case_2_code = """
def calculate(a, b):
return a + b  # 這裡缺少縮排
"""

# 案例 3: 語法正確
case_3_code = """
if 1 > 0:
    message = "Hello, Python!"
    print(message)
"""

print("--- 執行測試案例 ---")
check_syntax(case_1_code)
print("\n" + "="*50 + "\n")
check_syntax(case_2_code)
print("\n" + "="*50 + "\n")
check_syntax(case_3_code)

案例分析及細節解說

案例 1: 缺少冒號的語法錯誤

  • 程式碼細節:

    Python
    for i in range(10)  # 這裡缺少 ':'
        print(i)
    
  • 錯誤類型: SyntaxError

  • 解說細節: Python 的循環語句(如 for 循環)的標頭必須以冒號 : 結尾。由於 compile() 無法識別這個不完整的結構,它會拋出 SyntaxError,並通常指出在預期冒號的地方發生了錯誤。

案例 2: 缺少縮排的語法錯誤

  • 程式碼細節:

    Python
    def calculate(a, b):
    return a + b  # 這裡缺少縮排
    
  • 錯誤類型: IndentationError

  • 解說細節: 在 Python 中,函數、類別、條件或循環後,其主體(Body)必須使用一致的縮排來定義。IndentationErrorSyntaxError 的一個特殊子類,表示程式碼塊的結構問題。compile() 會識別到 def 後沒有正確的縮排塊,從而拋出此錯誤。

案例 3: 語法完全正確

  • 程式碼細節:

    Python
    if 1 > 0:
        message = "Hello, Python!"
        print(message)
    
  • 結果: compile() 成功返回一個程式碼物件。

  • 解說細節:

    • if 語句使用了冒號 :

    • if 塊內部的語句使用了正確的縮排(四個空格)。

    • 字串使用正確的引號。

    • 所有關鍵字和標點符號都符合 Python 規範。

    • 函數返回 True,表示語法無誤。

提示詞 (Prompt) 範例

  • Prompt 範例:

    "請幫我編寫一個名為 validate_code 的 Python 函數,專門使用 compile() 方法來檢查使用者輸入的程式碼字串。該函數必須捕獲 SyntaxErrorIndentationError,並在捕獲到錯誤時,打印出錯誤的詳細訊息和行號。"


總結

這個程式碼範例演示了如何透過 try...except 結構,結合 compile() 函數,來可靠地在不執行程式碼的情況下,進行嚴格的 Python 語法驗證。

留言

這個網誌中的熱門文章

🌻AI 時代自媒體行銷與 SEO 實務操作技巧 ~邱允文

🚀 🚀用AI打造你的自媒體金礦!實戰課程~邱允文

🚀 學會撰寫高效Prompt~提升AI回應的準確性與實用性~邱允文