codeop --- Python コードをコンパイルする¶
ソースコード: Lib/codeop.py
codeop モジュールは、code モジュールが行っているように、Python の read-eval-print (読み込み・評価・表示) ループをエミュレートするための機能を提供します。
通常、このモジュールを直接使う必要はありません。
そのようなループをプログラムに組み込むには、代わりに code モジュールを使うとよいでしょう。
この仕事には二つの部分があります:
入力の一行がPythonの文として完全であるかどうかを見分けられること: 簡単に言えば、次が '
>>>' か、あるいは '...' かどうかを見分けます。ユーザーが入力した 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__文を含むプログラムテキストをコンパイルすると、その文の指定を記憶し、以後のすべてのプログラムテキストにもその指定を適用してコンパイルします。