「Pythonチュートリアル」を見ると名前空間は「名前からオブジェクトへの対応付け (mapping) です。ほとんどの名前空間は、現状では Python の辞書として実装されています」とある。一方、スコープは「ある名前空間が直接アクセスできるような、 Python プログラムのテキスト上の領域」となっている。
「ある名前空間が直接アクセスできるような」というのは「ある名前空間で定義されている要素に直接アクセス可能」といった意味合いだ。「直接アクセス可能」とは「名前空間名.要素名」ではなく「要素名」だけを指定してアクセスできるテキスト領域(Pythonのコードの一部分)を意味する(ここで「名前空間名」とは例えば、モジュール名=Pythonコードを含むファイルの名前やクラス名などのこと。モジュールやクラスはスコープと名前空間を新たに形成し、他の名前空間内の名前との衝突を避けるのに利用できる。この辺りの考え方はC#などの言語もPythonも同様だ)。
これはつまり、「Python言語リファレンス」で書かれている「ブロック内の名前の可視性を決めます」ということだ(こちらの方が、本フォーラムの読者の方には分かりやすい表現だろう)。
話をまとめると、Pythonでは(多くの場合)名前空間は辞書として実装され、そこに名前とオブジェクトの対が保存される。そして、何らかの名前を検索する際にはローカルスコープから組み込み名前空間へと向かいながら、個々のスコープに対応する名前空間にその名前が存在しているかを検索していくことになる。
以下では、Pythonの組み込み関数を使いながら、この仕組みを少し探ってみよう。
Pythonではスコープや名前空間に関する組み込み関数として以下のものがある。
組み込み関数 | 説明 |
---|---|
dir | 引数なしで呼び出すと現在のローカルスコープで定義されている(値に束縛されている)名前のリストを返す。引数に何らかのオブジェクトを渡すと、そのオブジェクトが持つ属性(メンバ)を返す |
locals | 現在のローカルスコープの名前空間の内容(辞書)を返す |
globals | 現在のグローバルスコープの名前空間の内容(辞書)を返す |
組み込み関数dir/locals/globals |
組み込み関数dirにはモジュールやクラスなどを渡すことで、そこに含まれるメンバを調べることも可能だ(コマンドプロンプトのdirコマンドが、ディレクトリの内容を表示するのと同様に、組み込み関数dirは与えられたオブジェクトの内容を表示するものだと考えるとよい)。ただし、以下では組み込み関数dirではなく、次に述べる組み込み関数localsとglobalsを使用して、Pythonのスコープや名前空間について調べていくことにしよう。
組み込み関数localsはローカルスコープの名前空間の内容を表す辞書を、組み込み関数globalsはグローバルスコープの名前空間の内容を表す辞書を返す。
まずは[Interactive]ウィンドウで以下を試してみる。
locals()
globals()
locals() == globals()
実行結果を以下に示す。
何やらコピーライト表記などが表示されている。このコピーライト表記は組み込み名前空間(__builtins__変数が参照しているオブジェクト)で定義されている名前「copyright」の内容だ。PTVSの[Interactive]ウィンドウでは、__builtins__変数は組み込み名前空間を表す辞書となっていて、それが組み込み関数locals/globals呼び出しの結果、展開されて見えている。これは通常のPythonの対話環境の動作とは異なっているので注意されたい。コマンドプロンプトなどからpythonコマンドで対話環境を起動した場合の結果は次のようになる。
こちらでは__builtins__変数が参照しているのは組み込みモジュールのbuiltinsであり、実行結果では「'__builtins__': <module 'builtins' (built-in)>」のように表示されている(上の画像の下線部)。このような動作の違いはPTVSでツールバーの[開始]ボタンをクリックしてPythonのスクリプトファイルを実行した場合でも同様であることから*1、以下では画面出力のシンプルさを重視して、コマンドプロンプトからpythonコマンドで対話環境を起動した場合の結果を基に話を進めていく。
*1 「Python言語リファレンス」の「組み込みと制限付きの実行」を見ると、「__builtins__ は辞書かモジュールでなければなりません (後者の場合はモジュールの辞書が使われます)。デフォルトでは、 __main__ モジュール中においては、 __builtins__ は組み込みモジュール builtins です; それ以外の任意のモジュールにおいては、 __builtins__ は builtins モジュール自身の辞書のエイリアスです」と書いてある。PTVSの[Interactive]ウィンドウでは通常は__main__モジュールに含まれるコードを実行するので上の引用からすると「builtinsモジュール」が見えそうなところだが、そうではなく「builtinsモジュール自身の辞書のエイリアス」が見えている状態になっているということだ。
以上を踏まえて、次ページでは組み込み関数locals/globalsを使ってPythonのスコープや名前空間について調べていく。
Copyright© Digital Advantage Corp. All Rights Reserved.