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 |
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 ライブラリリファレンス の 組み込み関数 を参照してください。