Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】関数名を格納した文字列からモジュールの関数を動的に呼び出す方法

Pythonでは、オブジェクトが持つインスタンス変数やメソッドはすべて「属性」として扱われます。そのため、関数名を格納した文字列からモジュール内の関数を呼び出すには、まず該当する属性を取得し、そこに紐づいている関数オブジェクトを実行するという流れになります。

getattr() を使った基本的な呼び出し方

文字列から関数を呼び出す際に最も推奨されるのが、組み込み関数の getattr() を使う方法です。例えば、foo というモジュールに bar という関数が定義されており、その関数名が文字列 "bar" として変数に格納されているケースを考えてみましょう。foo.bar() を呼び出すベストプラクティスは以下の通りです。

>>> import foo
>>> method_to_call = getattr(foo, 'bar')
>>> result = method_to_call()

getattr(オブジェクト, 属性名) の形式で指定することで、文字列で与えられた名前に対応する関数オブジェクトを取得できます。取得したオブジェクトは通常の関数と同じように () を付けて実行可能です。

なお、属性が存在しない可能性がある場合は、getattr(foo, 'bar', None) のように第3引数にデフォルト値を指定しておくと、エラーを回避して安全に処理を進められます。

globals() / locals() を使う方法

モジュールのプレフィックスなしで、グローバル名前空間やローカル名前空間に直接定義されている関数を呼び出したい場合は、globals()locals() を利用する方法もあります。

  • locals(): 現在のローカルシンボルテーブルを辞書形式で返します
  • globals(): グローバルシンボルテーブルを辞書形式で返します

これらの辞書に対して、関数名をキーとしてアクセスすれば、目的の関数オブジェクトを取り出せます。

記述例

>>> result = locals()["myfunction"]()

または

>>> result = globals()["myfunction"]()

注意点:eval() の使用は避けよう

文字列からコードを実行する手段として eval() を使う例も見かけますが、これは任意のコードが実行される危険性があり、セキュリティ上のリスクが高いため推奨されません。動的に関数を呼び出す場合は、getattr()globals()/locals() を使う方法が安全かつ可読性にも優れています。

まとめ

  • モジュール内の関数を文字列から呼び出すなら getattr() が第一候補
  • 名前空間直下の関数なら globals()locals() の辞書経由で取得可能
  • 存在しない属性への対策として getattr() のデフォルト値引数を活用する
  • eval() による実行はセキュリティリスクがあるため避ける
  1. MATLABからPython関数を呼び出す方法を徹底解説

    MATLABでは、バージョン2014b以降からPythonライブラリが標準で利用できるようになりました。そのため、2014b以降のバージョンを使用していれば、MATLAB上で直接Pythonコードを実行することが可能です。PythonモジュールをMATLABで使う基本この機能により、MATLABの中でPythonモジュールを活用できます。特別な設定は一切不要で、使用したいPythonライブラリ名の前に「py」というプレフィックスを付けるだけで呼び出せます。ここでは、Pythonのcalendarモジュールを例に、うるう年の判定を行ってみましょう。py.calendar.isleap(2016)

  2. コマンドラインからPythonモジュールを呼び出す方法

    コマンドラインからPythonモジュールを呼び出す基本方法 Pythonでスクリプトをモジュールとして作成する場合、その動作を手軽に確認する方法のひとつが、スクリプトの末尾に関数呼び出しを追加して実行することです。 1. スクリプトの末尾に関数呼び出しを追加する たとえば、次のように関数 fubar() を定義したスクリプトがあるとします。ファイルの最後に関数を呼び出すコードを記述します。 def fubar(): # 何か便利な処理を行う print(fubar が実行されました) fubar() 2. コマンドプロンプトから実行する ターミナル(コマンドプロンプト)で