組み込み関数のlocals()は,ローカルシンボルテーブルの定義されている辞書を返す。この辞書に対して操作を行うと,変数やモジュールを定義できる。
>>> a # 未定義の変数aを参照(当然エラーになる) Traceback (most recent call last): File "", line 1, in ? NameError: name 'a' is not defined >>> locals()["a"] = 1 # locals()の返す辞書のキーに代入 >>> a # 変数定義と同じ結果になる 1
Pythonではモジュールもオブジェクトである。また,インポートしたモジュールはname(名前)としてローカルシンボルテーブルに定義される。__import__()関数を使ってモジュールオブジェクトを得て,変数と同じように定義するとモジュールを無理矢理インポートして定義することもできる。
>>> m = __import__("sys") # インポートしてモジュールオブジェクトを変数に代入 >>> m.getdefaultencoding() # モジュールオブジェクトに対して関数呼び出しを行う 'ascii' >>> sys.getdefaultencoding() # でも,sysモジュールはnameとして定義されていない >>> locals()["sys"] = m # locals()を使ってモジュールを定義 >>> sys.getdefaultencoding() # 今度はちゃんと呼び出せる 'ascii'
Pythonってシンプルでいいなあ:-)。