#
6.12 `import` 文

  `import_stmt` | ::= | `"import" module ["as" name] ( "," module ["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 ライブラリリファレンス の 組み込み関数 を参照してください。