code --- インタープリター基底クラス

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


code モジュールはread-eval-print (読み込み-評価-表示)ループをPythonで実装するための機能を提供します。対話的なインタプリタプロンプトを提供するアプリケーションを作るために使える二つのクラスと便利な関数が含まれています。

class code.InteractiveInterpreter(locals=None)

このクラスは構文解析とインタープリター状態(ユーザの名前空間)を取り扱います。入力バッファリングやプロンプト出力、または入力ファイル指定を扱いません(ファイル名は常に明示的に渡されます)。オプションの locals 引数はその中でコードが実行される名前空間として使用されるマッピングを指定します。その初期値は、キー '__name__' が '__console__' に設定され、キー '__doc__' が None に設定された新しく作られた辞書です。

InteractiveInterpreter インスタンスで作成した関数やクラスのオブジェクトは、locals で指定した名前空間に属します。 これらを pickle 化できるのは、locals が既存のモジュールの名前空間である場合だけです。

class code.InteractiveConsole(locals=None, filename='<console>', *, local_exit=False)

Python の対話型インタープリターの振る舞いを忠実にエミュレートします。このクラスは InteractiveInterpreter を継承しており、よく知られた sys.ps1 と sys.ps2 を使用してプロンプトと入力バッファリングを追加します。 local_exit が真の場合、コンソールでの exit() と quit() は SystemExit を送出せず、代わりに呼び出し元のコードに戻ります。

バージョン 3.13 で変更: local_exit 引数が追加されました。

code.interact(banner=None, readfunc=None, local=None, exitmsg=None, local_exit=False)

read-eval-print ループを実行するための便利な関数。これは InteractiveConsole の新しいインスタンスを作り、 readfunc が与えられた場合は InteractiveConsole.raw_input() メソッドとして使われるように設定します。 local が与えられた場合は、インタープリターループのデフォルト名前空間として使うために InteractiveConsole コンストラクタへ渡されます。 local_exit が与えられた場合は、 InteractiveConsole コンストラクタへ渡されます。そして、インスタンスの interact() メソッドは、もし提供されていれば、見出しと終了メッセージして使うために banner と exitmsg を受け取り実行されます。コンソールオブジェクトは使われた後捨てられます。

バージョン 3.6 で変更: exitmsg 引数が追加されました.

バージョン 3.13 で変更: local_exit 引数が追加されました。

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

この関数はPythonのインタプリタメインループ(別名、read-eval-printループ)をエミュレートしようとするプログラムにとって役に立ちます。扱いにくい部分は、ユーザが(完全なコマンドや構文エラーではなく)さらにテキストを入力すれば完全になりうる不完全なコマンドを入力したときを決定することです。この関数は ほとんど の場合に実際のインタプリタメインループと同じ決定を行います。

source はソース文字列です。filename はオプションのソースが読み出されたファイル名で、デフォルトで '<input>' です。symbol はオプションの文法の開始記号で、'single' (デフォルト)または 'eval' か 'exec' にすべきです。

コマンドが完全で有効ならば、コードオブジェクトを返します(compile(source, filename, symbol) と同じ)。コマンドが完全でないならば、 None を返します。コマンドが完全で構文エラーを含む場合は、 SyntaxError を発生させます。または、コマンドが無効なリテラルを含む場合は、 OverflowError もしくは ValueError を発生させます。

対話的なインタプリタオブジェクト

InteractiveInterpreter.runsource(source, filename='<input>', symbol='single')

インタプリタ内のあるソースをコンパイルし実行します。引数は compile_command() のものと同じです。 filename のデフォルトは '<input>' で、 symbol は 'single' です。あるいくつかのことが起きる可能性があります:

  • 入力が不正で、compile_command() が例外 (通常は SyntaxError) を送出した場合。 showsyntaxerror() メソッドを呼び出して構文エラーのトレースバックを表示します。 runsource() は False を返します。

  • 入力が完全でなく、さらに入力が必要。 compile_command() が None を返した場合。 runsource() は True を返します。

  • 入力が完全。 compile_command() がコードオブジェクトを返した場合。 (SystemExit を除く実行時例外も処理する) runcode() を呼び出すことによって、コードは実行されます。 runsource() は False を返します。

戻り値は、次の行のプロンプトに sys.ps1 か sys.ps2 のどちらを使うのか判断するために使えます。

InteractiveInterpreter.runcode(code)

コードオブジェクトを実行します。例外が生じたときは、トレースバックを表示するために showtraceback() が呼び出されます。伝搬することが許されている SystemExit を除くすべての例外が捉えられます。

KeyboardInterrupt についての注意。このコードの他の場所でこの例外が生じる可能性がありますし、常に捕らえることができるとは限りません。呼び出し側はそれを処理するために準備しておくべきです。

InteractiveInterpreter.showsyntaxerror(filename=None)

起きたばかりの構文エラーを表示します。 構文エラーにはスタックトレースがないため、スタックトレースは表示しません。 filename を指定すると、Python のパーサーが提供するデフォルトのファイル名の代わりに、その値を例外に設定します。 これは、文字列から読み込む場合にパーサーが常に '<string>' を使うためです。 出力は write() メソッドで書き込まれます。

InteractiveInterpreter.showtraceback()

起きたばかりの例外を表示します。スタックの最初の項目を取り除きます。なぜなら、それはインタプリタオブジェクトの実装の内部にあるからです。出力は write() メソッドによって書き込まれます。

バージョン 3.5 で変更: 最初のトレースバックではなく、完全なトレースバックの連鎖が表示されます。

InteractiveInterpreter.write(data)

文字列を標準エラーストリーム(sys.stderr)へ書き込みます。必要に応じて適切な出力処理を提供するために、派生クラスはこれをオーバーライドすべきです。

対話的なコンソールオブジェクト

InteractiveConsole クラスは InteractiveInterpreter のサブクラスです。以下の追加メソッドだけでなく、インタプリタオブジェクトのすべてのメソッドも提供します。

InteractiveConsole.interact(banner=None, exitmsg=None)

対話的な Python コンソールをそっくりにエミュレートします。オプションの banner 引数は最初のやりとりの前に表示するバナーを指定します。デフォルトでは、標準 Python インタプリタが表示するものと同じようなバナーを表示します。それに続けて、実際のインタプリタと混乱しないように (とても似ているから!) 括弧の中にコンソールオブジェクトのクラス名を表示します。

オプション引数の exitmsg は、終了時に出力される終了メッセージを指定します。空文字列を渡すと、出力メッセージを抑止します。もし、 exitmsg が与えられないか、None の場合は、デフォルトのメッセージが出力されます。

バージョン 3.4 で変更: バナーの表示を抑制するには、空の文字列を渡してください。

バージョン 3.6 で変更: 終了時に、終了メッセージを表示します。

InteractiveConsole.push(line)

ソーステキストの1行をインタープリターへ送ります。 line の末尾に改行を含めてはいけませんが、内部には含められます。 その行はバッファに追加され、バッファの内容を連結したものをソースとして、 インタープリターの runsource() メソッドが呼び出されます。 この呼び出しの結果が、コマンドが実行されたか無効だったことを示す場合、バッファはリセットされます。 そうでない場合、コマンドは不完全なので、その行を追加した後のバッファがそのまま保持されます。 さらに入力が必要な場合は True を返し、その行が何らかの形で処理された場合は False を返します (これは runsource() と同じです)。

InteractiveConsole.resetbuffer()

入力バッファから処理されていないソーステキストを取り除きます。

InteractiveConsole.raw_input(prompt='')

プロンプトを書き込み、一行を読み込みます。返る行は末尾に改行を含みません。ユーザがEOFキーシーケンスを入力したときは、 EOFError を発生させます。基本実装では、 sys.stdin から読み込みます。サブクラスはこれを異なる実装と置き換えるかもしれません。