このサイトについて

Pythonで無理矢理変数やモジュールを定義する

Pythonで無理矢理変数やモジュールを定義する

組み込み関数の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ってシンプルでいいなあ:-)。

2010-08-27 04:40