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