codeop --- Python コードをコンパイルする

ソースコード: Lib/codeop.py


codeop モジュールは、code モジュールが行っているように、Python の read-eval-print (読み込み・評価・表示) ループをエミュレートするための機能を提供します。 通常、このモジュールを直接使う必要はありません。 そのようなループをプログラムに組み込むには、代わりに code モジュールを使うとよいでしょう。

この仕事には二つの部分があります:

  1. 入力の一行がPythonの文として完全であるかどうかを見分けられること: 簡単に言えば、次が '>>>' か、あるいは '...' かどうかを見分けます。

  2. ユーザーが入力した future 文を記憶し、それ以降の入力を、その指定が有効な状態でコンパイルできること。

codeop モジュールは、これらを個別に行う手段と、両方をまとめて行う手段を提供します。

前者は実行するには:

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

Pythonコードの文字列であるべき source をコンパイルしてみて、source が有効なPythonコードの場合はコードオブジェクトを返します。このような場合、コードオブジェクトのファイル名属性は、デフォルトで '<input>' である filename でしょう。source が有効なPythonコードでは ない が、有効なPythonコードの接頭語である場合には、None を返します。

source に問題がある場合は、例外を発生させます。無効なPython構文がある場合は、 SyntaxError を発生させます。また、無効なリテラルがある場合は、 OverflowError または ValueError を発生させます。

symbol 引数は source が文としてコンパイルされるか('single' 、デフォルト) 、文 のシーケンスとしてか ('exec') 、または 式 としてコンパイルされるかを決定します('eval')。他のどんな値も ValueError を送出させます。

注釈

ソースの終わりに達する前に、成功した結果をもってパーサは構文解析を止めることがあります。このような場合、後ろに続く記号はエラーとならずに無視されます。例えば、バックスラッシュの後ろに改行が2つあって、その後ろにゴミがあるかもしれません。パーサのAPIがより良くなればすぐに、この挙動は修正されるでしょう。

class codeop.Compile

このクラスのインスタンスは、組み込み関数 compile() と同じシグネチャの __call__() メソッドを持ちます。 ただし、__future__ 文を含むプログラムテキストをコンパイルすると、その文の指定を記憶し、以後のすべてのプログラムテキストにもその指定を適用してコンパイルします。

class codeop.CommandCompiler

このクラスのインスタンスは、compile_command() と同じシグネチャの __call__() メソッドを持ちます。 ただし、__future__ 文を含むプログラムテキストをコンパイルすると、その文の指定を記憶し、以後のすべてのプログラムテキストにもその指定を適用してコンパイルします。