Pythonではモジュールもオブジェクトです。
Pythonインタープリタがimport
文を見つけると、指定されたファイルをコンパイルしてmodule
オブジェクトを作り、変数に代入します。
関数の中にimport
文を書くと、関数を呼ぶ度にimport
処理してしまいます。モジュールはキャッシュされるので、2回目からはキャッシュされたモジュールが変数に代入されます。PEP8ではimport
文をファイルの先頭にまとめて書くことを推奨しています。
以下のimport
文は、
import math
import numpy as np
from random import choice
from random import randint as ri
Pythonインタープリタは以下のように解釈して実行します。
__import__
は組込み関数 です。
※注意※: リンク先に書いてありますが、ユーザプログラムではimportlib.import_module()
を使いましょう。
math = __import__('math')
np = __import__('numpy')
choice = __import__('random').choice
ri = __import__('random').randint
vars()
で変数辞書を確認してみます。
実験
>>> import math
>>> vars()
{(中略),
'math': <module 'math' from '/usr/lib/python3.6/lib-dynload/math.cpython-36m-x86_64-cygwin.dll'>}
>>> random = __import__('random')
>>> vars()
{(中略),
'math': <module 'math' from '/usr/lib/python3.6/lib-dynload/math.cpython-36m-x86_64-cygwin.dll'>,
'random': <module 'random' from '/usr/lib/python3.6/random.py'>}
>>> random.randint(1, 100)
11
>>> from random import randint as ri
>>> vars()
{(中略),
'math': <module 'math' from '/usr/lib/python3.6/lib-dynload/math.cpython-36m-x86_64-cygwin.dll'>,
'random': <module 'random' from '/usr/lib/python3.6/random.py'>,
'ri': <bound method Random.randint of <random.Random object at 0x60029f1e8>>}
>>> ri(1, 100)
15
import
文は、指定したスクリプトファイルを読み込んでmodule
オブジェクトを作成して変数に代入する処理のシンタックスシュガー(糖衣構文)と言えます。