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

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


The codeop module provides utilities upon which the Python read-eval-print loop can be emulated, as is done in the code module. As a result, you probably don't want to use the module directly; if you want to include such a loop in your program you probably want to use the code module instead.

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

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

  2. どのfuture文をユーザが入力したのかを覚えていること。したがって、実質的にそれに続く入力をこれらとともにコンパイルすることができます。

The codeop module provides a way of doing each of these things, and a way of doing them both.

前者は実行するには:

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__ 文を含むプログラムテキストをコンパイルする場合に、インスタンスは有効なその文とともにそれに続くすべてのプログラムテキストを'覚えていて'コンパイルするという違いがあります。