29.2。 codeop —Pythonコードをコンパイルする
codeop モジュールは、 code モジュールで行われているように、Pythonのread-eval-printループをエミュレートできるユーティリティを提供します。 その結果、モジュールを直接使用したくない場合があります。 プログラムにそのようなループを含めたい場合は、代わりに code モジュールを使用することをお勧めします。
このジョブには2つの部分があります。
- 入力行がPythonステートメントを完了したかどうかを判断できる、つまり、次に「
>>>
」と「...
」のどちらを出力するかを判断できます。 - ユーザーが入力した将来のステートメントを記憶しているため、これらを有効にして後続の入力をコンパイルできます。
codeop モジュールは、これらのそれぞれを実行する方法と、両方を実行する方法を提供します。
前者だけを行うには:
- codeop.compile_command(source[, filename[, symbol]])
source をコンパイルしようとします。これはPythonコードの文字列であり、 source が有効なPythonコードである場合はコードオブジェクトを返します。 その場合、コードオブジェクトのファイル名属性は filename になり、デフォルトは
'<input>'
になります。 source が not 有効なPythonコードであるが、有効なPythonコードのプレフィックスである場合、None
を返します。source に問題がある場合、例外が発生します。
SyntaxError
は、無効なPython構文がある場合に発生し、OverflowError
またはValueError
は無効なリテラルがある場合に発生します。symbol 引数は、 source がステートメント(
'single'
、デフォルト)としてコンパイルされるか、式('eval'
)としてコンパイルされるかを決定します。 ])。 その他の値を指定すると、ValueError
が発生します。ノート
ソースの最後に到達する前に、パーサーが正常な結果で解析を停止する可能性があります(ただし、可能性は低いです)。 この場合、エラーを発生させる代わりに、末尾の記号を無視することができます。 たとえば、バックスラッシュの後に2つの改行が続くと、任意のガベージが続く場合があります。 これは、パーサーのAPIが改善されたら修正されます。
- class codeop.Compile
- このクラスのインスタンスには、組み込み関数 compile()と署名が同じ
__call__()
メソッドがありますが、インスタンスが __ future __ [X209Xを含むプログラムテキストをコンパイルする場合は異なります。 ]ステートメントの場合、インスタンスは「記憶」し、ステートメントが有効な状態で後続のすべてのプログラムテキストをコンパイルします。
- class codeop.CommandCompiler
- このクラスのインスタンスには、 compile_command()と署名が同じ
__call__()
メソッドがあります。 違いは、インスタンスが__future__
ステートメントを含むプログラムテキストをコンパイルする場合、インスタンスは「記憶」し、ステートメントが有効な状態で後続のすべてのプログラムテキストをコンパイルすることです。
バージョンの互換性に関する注意: Compile と CommandCompiler はPython2.2の新機能です。 2.2の将来追跡機能を有効にし、2.1以前のバージョンのPythonとの互換性を維持したい場合は、次のいずれかを記述できます。
try:
from codeop import CommandCompiler
compile_command = CommandCompiler()
del CommandCompiler
except ImportError:
from codeop import compile_command
これは影響の少ない変更ですが、プログラムに不要なグローバル状態を導入する可能性があります。または、次のように記述できます。
try:
from codeop import CommandCompiler
except ImportError:
def CommandCompiler():
from codeop import compile_command
return compile_command
その後、新しいコンパイラオブジェクトが必要になるたびにCommandCompiler
を呼び出します。