less than 1 minute read

たまに使うんだけど毎日使うというほどでもないので使い方を何回も調べている道具シリーズ。

実行時に、名前からオブジェクトを取得したり、逆にオブジェクトの名前を知りたいと思うことがある。

オブジェクトから名前を得る

  • __module__で、そのオブジェクトが定義されているモジュールの名前が分かる。
  • __name__で、そのオブジェクトの名前が分かる。

名前からオブジェクトを得る

  • getattr(モジュール、名前)で、そのモジュールの中で、その名前で定義されているオブジェクトを得ることができる。

def func(x: int) -> int:
    return x + 1

def func2(y: int) -> int:
    return y + 2

こんなモジュールが、あったとする。

import importlib

from mymodule import func

mod_name = func.__module__

print("module name is", mod_name)
print("function name is", func.__name__)

mod = importlib.import_module(mod_name)
func2 = getattr(mod, "func2")

print("calculated value is", func2(100))

こんなプログラムを実行すると、

module name is mymodule
function name is func
calculated value is 102

こんな結果になる。

名前が複数あるときは

よく考えると、オブジェクトは別の変数に代入することができる。そすっと、オブジェクトは複数の「名前」で呼ぶことができる。 先ほどの例を、以下のように少し変更する。

def func(x: int) -> int:
    return x + 1

def func2(y: int) -> int:
    return y + 2

func3 = func2

で、以下を実行すると

import mymodule

func3 = getattr(mymodule, "func3")
print("name of func3 is", func3.__name__)

こんな結果になる。

name of func3 is func2

なるほど

タグ:

カテゴリー:

更新日時: