"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__" 陳
   述式的程式文本，實例會「記住」並使用該陳述式開始編譯所有後續程式文
   本。
