パイソンインタプリタはいつでも利用できるように組み込まれた多くの関数を持っています。ここではアルファベット順にリストしてあります。
例えば、import spamは
__import__('spam', globals(), locals(), [])という呼び出しになります。
from spam.ham import eggsの結果は
__import__('spam.ham', globals(), locals(),
['eggs'])になります。
注:locals()と['eggs']が引数として渡されたとしても、__import__()関数はeggsというローカル変数をセットしません。
これはimport文ように生成されたその後のコードで行われます。(実際、標準的な実装ではlocals引数は全く使われず、globalsのみをimport文のパッケージコンテキストを決定するために使います。)
name変数がpackage.module形式の場合、通常nameという名前のモジュールではなくトップレベルパッケージ(最初のドットまでの名前)が返されます。しかし、空でないfromlist引数が与えられたときはnameという名前のモジュールが返されます。 これは異なる種類のimport文のために生成されたバイトコードとの互換性のために行われます。"import spam.ham.eggs"を使う場合、トップレベルパッケージspamはインポートしているネームスペース内におかれていなければなりません。しかし、"from spam.ham import eggs"を使った場合spam.hamサブパッケージがeggs変数を見付けるために使われます。
>>> import sys >>> dir() ['sys'] >>> dir(sys) ['argv', 'exit', 'modules', 'path', 'stderr', 'stdin', 'stdout'] >>>
>>> x = 1 >>> print eval('x+1') 2 >>>
この関数は任意のコードオブジェクト(例えばcompile()で生成された)を実行させるためにも使われます。 この場合文字列の代わりにコードオブジェクトを渡します。コードオブジェクトは kind引数に'eval'を渡してコンパイルされたものでなければなりません。
ヒント:文のダイナミック実行はexec文でサポートされています。 ファイルからの文の実行はexecfile()関数でサポートされています。 globals()とlocals()関数は、現在のグローバルとローカル辞書をそれぞれ返します。これはeval()やexecfile()に渡すときに役立ちます。
引数はファイル名と2つのオプションの辞書です。ファイルはパースされ、(モジュールと同じように)globalsとlocals辞書をグローバルとローカルネームスペースとして使ってパイソンの一連の文として評価されます。 locals辞書が省略されるとglobals辞書がデフォルトになります。 両方の辞書が省略されると、式はexecfile()が呼ばれた環境で評価されます。 戻り値はNoneです。
>>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(1, 11) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> range(0, 30, 5) [0, 5, 10, 15, 20, 25] >>> range(0, 10, 3) [0, 3, 6, 9] >>> range(0, -10, -1) [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] >>> range(0) [] >>> range(1, 0) [] >>>
>>> s = raw_input('--> ') --> Monty Python's Flying Circus >>> s "Monty Python's Flying Circus" >>>
readlineモジュールがロードされていれば、raw_input()はそれを使って役に立つ行編集と履歴機能を提供します。
警告がいくつかあります。
モジュールは文法的に正しいが初期化に失敗するときは、最初のimport文は その名前をローカルにバインドせず、(部分的に初期化された)モジュールオブジェクトをsys.modulesに保存します。そのモジュールを再ロードするためには、reload()する前に先ずimportし直さなければなりません(これはその名前を部分的に初期化されたモジュールオブジェクトにバインドします)。
モジュールが再ロードされたとき、その辞書(モジュールのグローバル変数を含む)は保持されています。名前の再定義は古い定義を上書きします。従って一般的には問題はありません。もし新しいバージョンのモジュールが古いバージョンで定義されていた名前を定義していないときは、古い定義は残っています。この機能はグローバルテーブルやオブジェクトのキャッシュを維持するときにモジュールの利点として使うことができます。たとえばtry文を使えば、テーブルの存在をテストしたり必要なら初期化をスキップすることができます。
sys、__main__、__builtin__を除いては、組み込みまたは動的にロードされるモジュールを再ロードすることは 一般的には合法ですが大変役に立つということではありません。 しかしあるケースでは、拡張モジュールは一回以上初期化されるようには設計されていなくて、再ロードしたときに気まぐれな感じで失敗することもあります。
モジュールがfrom... import ...を使って他のモジュールからオブジェクトをインポートしている場合、他のモジュールに対するreload()の呼び出しではそれからインポートされたオブジェクトを再定義することはありません。 これに対する一つの回避策はfrom文を再実行することで、別の方法はimportと修飾名(module.name)を代わりに使うことです。
モジュールがクラスのインスタンスをインスタンス化するときは、クラスを定義するモジュールを再ロードすることはインスタンスのメソッド定義に影響を与えません。 インスタンスは古いクラス定義を使い続けます。同じことは導出されたクラスについても言えます。
>>> import types >>> if isinstance(x, types.StringType): print "It's a string"
guido@python.org