30.1. code
--- インタプリタ基底クラス¶
ソースコード: Lib/code.py
code
モジュールはread-eval-print (読み込み-評価-表示)ループをPythonで実装するための機能を提供します。対話的なインタプリタプロンプトを提供するアプリケーションを作るために使える二つのクラスと便利な関数が含まれています。
-
class
code.
InteractiveInterpreter
(locals=None)¶ このクラスは構文解析とインタプリタ状態(ユーザの名前空間)を取り扱います。入力バッファリングやプロンプト出力、または入力ファイル指定を扱いません(ファイル名は常に明示的に渡されます)。オプションの locals 引数はその中でコードが実行される辞書を指定します。その初期値は、キー
'__name__'
が'__console__'
に設定され、キー'__doc__'
がNone
に設定された新しく作られた辞書です。
-
class
code.
InteractiveConsole
(locals=None, filename="<console>")¶ 対話的なPythonインタプリタの振る舞いを厳密にエミュレートします。このクラスは
InteractiveInterpreter
を元に作られていて、通常のsys.ps1
とsys.ps2
をつかったプロンプト出力と入力バッファリングが追加されています。
-
code.
interact
(banner=None, readfunc=None, local=None, exitmsg=None)¶ read-eval-print ループを実行するための便利な関数。これは
InteractiveConsole
の新しいインスタンスを作り、 readfunc が与えられた場合はInteractiveConsole.raw_input()
メソッドとして使われるように設定します。 local が与えられた場合は、インタプリタループのデフォルト名前空間として使うためにInteractiveConsole
コンストラクタへ渡されます。そして、インスタンスのinteract()
メソッドは(もし提供されていれば)見出しと終了メッセージして使うために banner と exitmsg を受け取り実行されます。コンソールオブジェクトは使われた後捨てられます。バージョン 3.6 で変更: exitmsg 引数が追加されました.
-
code.
compile_command
(source, filename="<input>", symbol="single")¶ この関数はPythonのインタプリタメインループ(別名、read-eval-printループ)をエミュレートしようとするプログラムにとって役に立ちます。扱いにくい部分は、ユーザが(完全なコマンドや構文エラーではなく)さらにテキストを入力すれば完全になりうる不完全なコマンドを入力したときを決定することです。この関数は ほとんど の場合に実際のインタプリタメインループと同じ決定を行います。
source はソース文字列です。filename はオプションのソースが読み出されたファイル名で、デフォルトで
'<input>'
です。symbol はオプションの文法の開始記号で、'single'
(デフォルト)または'eval'
のどちらかにすべきです。コマンドが完全で有効ならば、コードオブジェクトを返します(
compile(source, filename, symbol)
と同じ)。コマンドが完全でないならば、None
を返します。コマンドが完全で構文エラーを含む場合は、SyntaxError
を発生させます。または、コマンドが無効なリテラルを含む場合は、OverflowError
もしくはValueError
を発生させます。
30.1.1. 対話的なインタプリタオブジェクト¶
-
InteractiveInterpreter.
runsource
(source, filename="<input>", symbol="single")¶ インタプリタ内のあるソースをコンパイルし実行します。引数は
compile_command()
のものと同じです。 filename のデフォルトは'<input>'
で、 symbol は'single'
です。あるいくつかのことが起きる可能性があります:- 入力が不正。
compile_command()
が例外(SyntaxError
かOverflowError
)を起こした場合。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
)へ書き込みます。必要に応じて適切な出力処理を提供するために、派生クラスはこれをオーバーライドすべきです。
30.1.2. 対話的なコンソールオブジェクト¶
InteractiveConsole
クラスは InteractiveInterpreter
のサブクラスです。以下の追加メソッドだけでなく、インタプリタオブジェクトのすべてのメソッドも提供します。
-
InteractiveConsole.
interact
(banner=None, exitmsg=None)¶ 対話的な Python コンソールをそっくりにエミュレートします。オプションの banner 引数は最初のやりとりの前に表示するバナーを指定します。デフォルトでは、標準 Python インタプリタが表示するものと同じようなバナーを表示します。それに続けて、実際のインタプリタと混乱しないように (とても似ているから!) 括弧の中にコンソールオブジェクトのクラス名を表示します。
オプション引数の exitmsg は、終了時に出力される終了メッセージを指定します。空文字列を渡すと、出力メッセージを抑止します。もし、 exitmsg が与えられないか、
None
の場合は、デフォルトのメッセージが出力されます。バージョン 3.4 で変更: バナーの表示を抑制するには、空の文字列を渡してください。
バージョン 3.6 で変更: 終了時に、終了メッセージを表示します。
-
InteractiveConsole.
push
(line)¶ ソーステキストの一行をインタプリタへ送ります。その行の末尾に改行がついていてはいけません。内部に改行を持っているかもしれません。その行はバッファへ追加され、ソースとして連結された内容が渡されインタプリタの
runsource()
メソッドが呼び出されます。コマンドが実行されたか、有効であることをこれが示している場合は、バッファはリセットされます。そうでなければ、コマンドが不完全で、その行が付加された後のままバッファは残されます。さらに入力が必要ならば、戻り値はTrue
です。その行がある方法で処理されたならば、False
です(これはrunsource()
と同じです)。
-
InteractiveConsole.
resetbuffer
()¶ 入力バッファから処理されていないソーステキストを取り除きます。