4. 実行モデル¶
4.1. プログラムの構造¶
Python プログラムはコードブロックから構成されます。
ブロック (block) は、一つのまとまりとして実行される Python プログラムテキストの断片です。
モジュール、関数本体、そしてクラス定義はブロックであり、対話的に入力された個々のコマンドもブロックです。
スクリプトファイル (インタープリタに標準入力として与えられたり、インタープリタにコマンドライン引数として与えられたファイル) もコードブロックです。
スクリプトコマンド (インタープリタのコマンドライン上で -c
オプションで指定されたコマンド) もコードブロックです。
引数 -m
を使用して、コマンドラインからトップレベルスクリプト(すなわちモジュール __main__
)として実行されるモジュールもまたコードブロックです。組み込み関数 eval()
や exec()
に渡された文字列引数もコードブロックです。
コードブロックは、実行フレーム (execution frame) 上で実行されます。実行フレームには、 (デバッグに使われる) 管理情報が収められています。また、現在のコードブロックの実行が完了した際に、どのようにプログラムの実行を継続するかを決定しています。
4.2. 名前づけと束縛 (naming and binding)¶
4.2.1. 名前の束縛¶
名前 (name) は、オブジェクトを参照します。名前を導入するには、名前への束縛 (name binding) 操作を行います。
以下の構文が名前を束縛します:
formal parameters to functions,
クラス定義,
関数定義,
代入式,
targets that are identifiers if occurring in an assignment:
import
文.
The import
statement of the form from ... import *
binds all
names defined in the imported module, except those beginning with an underscore.
This form may only be used at the module level.
del
文で指定される対象は、(del
の意味付けは、実際は名前の解放 (unbind) ですが) 文の目的上、束縛済みのものとみなされます。
代入文や import 文はいずれも、クラスや関数定義、モジュールレベル (トップレベルのコードブロック) 内で起こります。
If a name is bound in a block, it is a local variable of that block, unless
declared as nonlocal
or global
. If a name is bound at
the module level, it is a global variable. (The variables of the module code
block are local and global.) If a variable is used in a code block but not
defined there, it is a free variable.
プログラムテキスト中に名前が出現するたびに、その名前が使われている最も内側の関数ブロック中で作成された 束縛 (binding) を使って名前の参照が行われます。
4.2.2. 名前解決¶
スコープ (scope) は、ブロック内の名前の可視性を決めます。 ローカル変数があるブロック内で定義されている場合、変数のスコープはそのブロックを含みます。 関数ブロック内で名前の定義を行った場合、その中のブロックが名前に別の束縛を行わない限り、定義ブロック内の全てのブロックを含むようにスコープが拡張されます。
ある名前がコードブロック内で使われると、その名前を最も近傍から囲うようなスコープ (最内スコープ: nearest enclosing scope) を使って束縛の解決を行います。こうしたスコープからなる、あるコードブロック内で参照できるスコープ全ての集合は、ブロックの環境(environment)と呼ばれます。
名前が全く見付からなかったときは、 NameError
例外が送出されます。
現在のスコープが関数のもので、名前が使われる場所でローカル変数がまだ値に束縛されていない場合、 UnboundLocalError
例外が送出されます。
UnboundLocalError
は NameError
の子クラスです。
ある名前がコードブロック内のどこかで束縛操作されていたら、そのブロック内で使われるその名前はすべて、現在のブロックへの参照として扱われます。このため、ある名前がそのブロック内で束縛される前に使われるとエラーにつながります。この規則は敏感です。Python には宣言がなく、コードブロックのどこでも名前束縛操作ができます。あるコードブロックにおけるローカル変数は、ブロックのテキスト全体から名前束縛操作を走査することで決定されます。例は UnboundLocalError についての FAQ 項目 を参照してください。
If the global
statement occurs within a block, all uses of the names
specified in the statement refer to the bindings of those names in the top-level
namespace. Names are resolved in the top-level namespace by searching the
global namespace, i.e. the namespace of the module containing the code block,
and the builtins namespace, the namespace of the module builtins
. The
global namespace is searched first. If the names are not found there, the
builtins namespace is searched. The global
statement must precede
all uses of the listed names.
global
文は、同じブロックの束縛操作と同じスコープを持ちます。ある自由変数の最内スコープに global 文がある場合、その自由変数はグローバル変数とみなされます。
The nonlocal
statement causes corresponding names to refer
to previously bound variables in the nearest enclosing function scope.
SyntaxError
is raised at compile time if the given name does not
exist in any enclosing function scope.
あるモジュールの名前空間は、そのモジュールが最初に import された時に自動的に作成されます。スクリプトの主モジュール (main module) は常に __main__
と呼ばれます。
Class definition blocks and arguments to exec()
and eval()
are
special in the context of name resolution.
A class definition is an executable statement that may use and define names.
These references follow the normal rules for name resolution with an exception
that unbound local variables are looked up in the global namespace.
The namespace of the class definition becomes the attribute dictionary of
the class. The scope of names defined in a class block is limited to the
class block; it does not extend to the code blocks of methods -- this includes
comprehensions and generator expressions since they are implemented using a
function scope. This means that the following will fail:
class A:
a = 42
b = list(a + i for i in range(10))
4.2.3. 組み込みと制限付きの実行¶
CPython 実装の詳細: ユーザは __builtins__
に触れるべきではありません; これは厳密に実装の詳細です。組み込みの名前空間の中の値をオーバーライドしたいユーザは、 builtins
モジュールを import
して、その属性を適切に変更するべきです。
あるコードブロックの実行に関連する組み込み名前空間は、実際にはコードブロックのグローバル名前空間から名前 __builtins__
を検索することで見つかります; __builtins__
は辞書かモジュールでなければなりません (後者の場合はモジュールの辞書が使われます)。デフォルトでは、 __main__
モジュール中においては、 __builtins__
は組み込みモジュール builtins
です; それ以外の任意のモジュールにおいては、 __builtins__
は builtins
モジュール自身の辞書のエイリアスです。
4.2.4. 動的な機能とのやりとり¶
自由変数の名前解決はコンパイル時でなく実行時に行われます。つまり、以下のコードは42を出力します:
i = 10
def f():
print(i)
i = 42
f()
eval()
と exec()
関数は、名前の解決に、現在の環境の全てを使えるわけではありません。名前は呼び出し側のローカルやグローバル名前空間で解決できます。自由変数は最内名前空間ではなく、グローバル名前空間から解決されます。 [1] exec()
と eval()
関数にはオプションの引数があり、グローバルとローカル名前空間をオーバライドできます。名前空間が一つしか指定されなければ、両方の名前空間として使われます。
4.3. 例外¶
例外とは、コードブロックの通常の制御フローを中断して、エラーやその他の例外的な状況を処理できるようにするための手段です。例外はエラーが検出された時点で 送出 (raise) されます; 例外は、エラーが発生部の周辺のコードブロックか、エラーが発生したコードブロック直接または間接的に呼び出しているコードブロックで 処理 (handle) することができます。
Python インタプリタは、ランタイムエラー (ゼロ除算など) が検出されると例外を送出します。Python プログラムから、 raise
文を使って明示的に例外を送出することもできます。例外ハンドラ (exception handler) は、 try
... except
文で指定することができます。 try
文の finally
節を使うとクリーンアップコード (cleanup code) を指定できます。このコードは例外は処理しませんが、先行するコードブロックで例外が起きても起きなくても実行されます。
Python は、エラー処理に "プログラムの終了 (termination)" モデルを用いています: 例外ハンドラは、プログラムに何が発生したかを把握することができ、ハンドラの外側のレベルに処理を継続することはできますが、(問題のあったコード部分を最初から実行しなおすのでない限り) エラーの原因を修復したり、実行に失敗した操作をやり直すことはできません。
例外が全く処理されないとき、インタプリタはプログラムの実行を終了させるか、対話メインループに処理を戻します。
どちらの場合も、例外が SystemExit
でなければ、スタックのトレースバックを出力します。
例外は、クラスインスタンスによって識別されます。 except
節はインスタンスのクラスにもとづいて選択されます: これはインスタンスのクラスか、その 非仮想基底クラス を参照します。このインスタンスはハンドラによって受け取られ、例外条件に関する追加情報を伝えることができます。
注釈
例外のメッセージは、Python API 仕様には含まれていません。メッセージの内容は、ある Python のバージョンと次のバージョンの間で警告なしに変更される可能性があるので、複数バージョンのインタプリタで動作するようなコードは、例外メッセージの内容に依存させるべきではありません。
try
文については、 try 文 節、 raise
文については raise 文 節も参照してください。
脚注