6.12 import

import_stmt ::= "import" module ["as" name] ( "," module ["as" name] )*
| "from" module "import" identifier ["as" name]
  ( "," identifier ["as" name] )*
| "from" module "import" "(" identifier ["as" name]
  ( "," identifier ["as" name] )* [","] ")"
| "from" module "import" "*"
module ::= (identifier ".")* identifier
Download entire grammar as text.

import 文は、(1) モジュールを探し、必要なら初期化 (initialize) する; (import 文のあるスコープにおける) ローカルな名前空間で 名前を定義する、の二つの段階を踏んで初期化されます。 第一形式 (from のない形式) は、上記の段階をリスト中にある 各識別子に対して繰り返し実行していきます。 from のある形式では、(1) を一度だけ行い、次いで (2) を 繰り返し実行します。

組み込みモジュールや拡張モジュールの ``初期化'' は、ここでは 初期化関数の呼び出しを意味します。モジュールは初期化を行うために かならず初期化関数を提供しなければなりません (リファレンス実装では、関数名はモジュール名の前に ``init'' を つけたものになっています); Python で書かれたモジュールの ``初期化'' は、モジュール本体の 実行を意味します。

Python 処理系は、すでに初期化済みのモジュールや、初期化中のモジュール をモジュール名でインデクス化したテーブルを維持しています。 このテーブルは sys.modules からアクセスできます。 モジュール名がこのテーブル内にあるなら、段階 (1) は完了しています。 そうでなければ、処理系はモジュール定義の検索を開始します。モジュール が見つかった場合、モジュールを読み込み (load) ます。モジュール検索や 読み込みプロセスの詳細は、実装やプラットフォームに依存します。 一般的には、ある名前のモジュールを検索する際、まず同名の ``組み込み (built-in)'' モジュールを探し、次に sys.path で列挙されている場所を探します。

組み込みモジュールが見つかった場合 、 組み込みの初期化コードが実行され、段階 (1) を完結します。 合致するファイルが見つからなかった場合、 ImportError が送出されます。 ファイルが見つかった場合、ファイルを構文解析して実行可能な コードブロックにします。構文エラーが起きた場合、 SyntaxError が送出されます。 それ以外の場合、まず指定された名前をもつ空のモジュールを作成し、 モジュールテーブルに挿入します。次に、このモジュールの実行コンテキスト 下でコードブロックを実行します。実行中に例外が発生すると、段階 (1) を終了 (terminate) します。

段階 (1) が例外を送出することなく完了したなら、段階 (2) を開始 します。

import 文の第一形式は、ローカルな名前空間に置かれた モジュール名をモジュールオブジェクトに束縛し、import すべき 次の識別子があればその処理に移ります。モジュール名の後ろに as がある場合、as の後ろの名前はモジュールの ローカルな名前として使われます。

from 形式は、モジュール名の束縛を行いません: from 形式では、段階 (1) で見つかったモジュール内から、 識別子リストの各名前を順に検索し、見つかったオブジェクトを識別子の 名前でローカルな名前空間において束縛します。 import の第一形式と同じように、"as localname" で別名を与えることができます。指定された名前が見つからない場合、 ImportError が送出されます。識別子のリストを星印 ("*") で置き換えると、モジュールで公開されている名前 (public name) 全てを import 文のある場所のローカルな 名前空間に束縛します。。。

モジュールで 公開されている名前 (public names) は、 モジュールの名前空間内にある __all__ という名前の変数 を調べて決定します; __all__ が定義されている場合、 __all__ はモジュールで定義されていたり、import されている ような名前の文字列からなるシーケンスでなければなりません。 __all__ 内にある名前は、全て公開された名前であり、 実在するものとみなされます。 __all__ が定義されていない場合、モジュールの名前空間に 見つかった名前で、アンダースコア文字 ("_") で始まっていない 全ての名前が公開された名前になります。 __all__ には、公開されている API 全てを入れなければなりません。 __all__ には、(モジュール内で import されて使われている ライブラリモジュールのように) API を構成しない要素を意に反して 公開してしまうのを避けるという意図があります。

"*" を使った from 形式は、モジュールのスコープ内 だけに作用します。関数内でワイルドカードの import 文 -- "import *" -- を使い、関数が自由変数を伴うネストされたブロック であったり、ブロックを含んでいる場合、コンパイラは SyntaxError を送出します。

階層的なモジュール名:モジュール名に一つまたはそれ以上のドットが入っている場合、 モジュール検索パスは違った扱われ方をします。最後のドットまでの 各識別子からなる列は、``パッケージ (package)'' を見つけるために使われます; 次に、パッケージ内から各識別子が 検索されます。パッケージとは、一般には sys.path 上のディレクトリ のサブディレクトリで、__init__.py. ファイルを持つものです。 [XXX この説明については、ここでは今のところこれ以上詳しく書けません; 詳細や、パッケージ内モジュールの検索がどのように行われるかは、 http://www.python.org/doc/essays/packages.html を参照 してください]

どのモジュールがロードされるべきかを動的に決めたいアプリケーションの ために、組み込み関数 __import__() が提供されています; 詳細は、Python ライブラリリファレンス組み込み関数 を参照してください。



ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。