# `codeop` --- 編譯 Python 程式碼

原始碼：Lib/codeop.py

`codeop` 模組提供了可以模擬 Python read-eval-print 循環的工具程式 (utilities)，就像在 `code` 模組中所做的那樣。因此你可能不想直接使用該模組；如果你想在程式中包含這樣的循環，你可能需要使用 `code` 模組。

這個任務有兩個部分：

1. 能夠判斷一列輸入是否完成了一項 Python 陳述式：簡而言之，判斷接下來是列印 '`>>>`' 還是 '`...`'。

2. 記住使用者輸入了哪些未來陳述式，以便後續輸入可以在這些陳述式生效的情況下進行編譯。

`codeop` 模組提供了一種完成上述每項任務的方法，以及同時完成這兩項任務的方法。

只做前者：

codeop.compile_command(source, filename='<input>', symbol='single')

  嘗試編譯 source，它應該是 Python 程式碼的字串，如果 source 是有效的 Python 程式碼，則回傳一個程式碼物件 (code object)。在這種情況下，程式碼物件的檔案名稱屬性將為 filename，預設為 `'<input>'`。如果 source 不是有效的 Python 程式碼，而是有效 Python 程式碼的前綴，則回傳 `None`。

  如果 source 有問題，就會引發例外。如果存在無效的 Python 語法則會引發 `SyntaxError`；如果存在無效的文字 (literal)，則會引發 `OverflowError` 或 `ValueError`。

  symbol 引數決定 source 是否編譯為陳述式（`'single'`，為預設值）、為陳述式序列 (`'exec'`) 或為運算式 (`'eval'`)。任何其他值都會導致引發 `ValueError`。

  備註

  剖析器 (parser) 有可能（但通常不會）在到達原始碼的結尾之前停止剖析並獲得成功的結果；在這種情況下，尾隨符號可能會被忽略而不是導致錯誤。例如，反斜線後面加上兩個換行符號後可以是任意的無意義符號。這個問題在未來會因為剖析器 API 的改善而被解決。

class codeop.Compile

  此類別的實例具有 `__call__()` 方法，其簽名與內建函式 `compile()` 相同，區別在於如果實例編譯包含 `__future__` 陳述式的程式文本，實例會「記住」並使用該陳述式開始編譯所有後續程式文本。

class codeop.CommandCompiler

  此類別的實例具有 `__call__()` 方法，其簽名與內建函式 `compile_command()` 相同，區別在於如果實例編譯包含 `__future__` 陳述式的程式文本，實例會「記住」並使用該陳述式開始編譯所有後續程式文本。