【Python】文字列名から関数を動的に呼び出す方法

この記事では、Pythonで文字列名から関数を動的に呼び出す方法について解説します。

具体的には、eval()関数、globals()関数、getattr()関数の3つの方法を紹介します。

これにより、プログラムの柔軟性を高めることができます。

ただし、注意点もありますので、しっかりと理解しておきましょう。

目次から探す

Pythonでの関数の呼び出し方法の基本

Pythonでは、関数を呼び出すためには関数名に引数を指定して呼び出す方法が一般的です。

例えば、以下のような関数を定義した場合、関数名に引数を指定して呼び出すことができます。

def greet(name):
    print("Hello, " + name + "!")
    
greet("Alice")  # Hello, Alice!

このように、関数名に引数を指定して呼び出すことで、関数の処理が実行されます。

文字列名から関数を動的に呼び出す方法

Pythonでは、文字列として関数名を保持し、その文字列を使って関数を動的に呼び出すことも可能です。

以下では、文字列名から関数を呼び出すための3つの方法を紹介します。

eval()関数を使った文字列名から関数を呼び出す方法

eval()関数を使うと、文字列をPythonのコードとして評価し、実行することができます。

これを利用して、文字列名から関数を呼び出すことができます。

def greet(name):
    print("Hello, " + name + "!")
    
func_name = "greet"
eval(func_name + "('Bob')")  # Hello, Bob!

上記の例では、変数func_nameに関数名の文字列を代入し、eval()関数を使ってその文字列を評価しています。

評価結果として関数が呼び出され、結果としてHello, Bob!が出力されます。

globals()関数を使った文字列名から関数を呼び出す方法

globals()関数を使うと、グローバルスコープ内の変数や関数を辞書として取得することができます。

これを利用して、文字列名から関数を呼び出すことができます。

def greet(name):
    print("Hello, " + name + "!")
    
func_name = "greet"
globals()[func_name]("Charlie")  # Hello, Charlie!

上記の例では、変数func_nameに関数名の文字列を代入し、globals()関数を使ってその文字列に対応する関数を取得しています。

取得した関数を呼び出すことで、Hello, Charlie!が出力されます。

getattr()関数を使った文字列名から関数を呼び出す方法

getattr()関数を使うと、オブジェクトの属性を取得することができます。

関数もオブジェクトの一種であるため、getattr()関数を使って文字列名から関数を取得し、呼び出すことができます。

class Greeting:
    def greet(self, name):
        print("Hello, " + name + "!")
        
greeting = Greeting()
func_name = "greet"
getattr(greeting, func_name)("Dave")  # Hello, Dave!

上記の例では、クラスGreetingのインスタンスを作成し、変数func_nameに関数名の文字列を代入しています。

getattr()関数を使ってインスタンスと関数名を指定し、関数を取得して呼び出しています。

結果としてHello, Dave!が出力されます。

文字列名から関数を呼び出す際の注意点

文字列名から関数を呼び出す際には、以下の点に注意する必要があります。

  • eval()関数を使う場合、評価する文字列が信頼できるものであることを確認する必要があります。悪意のあるコードが評価される可能性があるため、注意が必要です。
  • globals()関数やgetattr()関数を使う場合、関数が定義されているスコープやオブジェクトにアクセスできる必要があります。適切なスコープやオブジェクトを指定することを忘れないようにしましょう。

以上が、Pythonで文字列名から関数を動的に呼び出す方法です。

これらの方法を使うことで、プログラムの柔軟性を高めることができます。

ただし、注意点にも留意しながら適切に利用しましょう。

目次から探す