全般

[Python] 実行中の関数名を取得する方法

今回は、Pythonで実行中の関数名を取得する方法についてご紹介します。

Pythonで実行中の関数名を取得する基本

Pythonでは、現在実行中の関数名をプログラムの内部から取得できます。

これはデバッグログ出力などの用途で役立ちます。

標準ライブラリのinspectモジュールやtracebackモジュールを活用すると、必要に応じて簡単に関数名を取り出すことが可能です。

inspect.currentframe()を使った方法

inspect.currentframe()は、現在のスタックフレームを取得するための関数です。

取得したフレームから、コードオブジェクトのf_code.co_name属性を参照することで関数名を得ることができます。

実行結果

実行中の関数名: sample_function

この方法では、必要最小限の情報のみ取得するため、パフォーマンス上の負荷が比較的小さいというメリットがあります。

ただし、inspect.currentframe()が返すフレームオブジェクトは参照循環を引き起こす可能性があるため、処理後にdelで削除することが推奨されています。

inspect.stack()を利用する方法

inspect.stack()は、呼び出しスタックの全てのフレームをリストとして取得できます。

呼び出し元のフレームを指定することで、関数名を取り出す仕組みです。

実行結果

実行中の関数名: another_function

この方法はスタック全体を取得するため、currentframe()よりも負荷が高くなる可能性があります。

ただし、呼び出し階層が深い場合などには、どのフレームから関数名を拾いたいかをインデックスで指定できる利点があります。

traceback.extract_stack()を活用する方法

traceback.extract_stack()を使うと、スタックトレースの各フレーム情報を抽出できます。

取得したリストの末尾付近に現在のフレームがあり、そこから一つ前を指定して呼び出し元の関数名を取得します。

実行結果

実行中の関数名: sample_trace_function

tracebackモジュールでも、スタック全体を取得する点はinspect.stack()と同様です。

頻繁に呼び出すとパフォーマンスに影響が出る場合があるため、主にログやエラー解析などの用途で使われることが多いです。

よくあるエラーや注意点

関数名の取得にはスタックフレームを操作するため、以下のような注意点があります。

  • パフォーマンス面への影響
    スタック全体を取得する方法は、負荷が大きくなる場合があります。
  • 参照循環
    inspect.currentframe()を使う場合は、フレームオブジェクトの削除を行うと安心です。
  • 最適化や実行環境への依存
    一部の実行環境(JITコンパイラなど)では、スタックフレームが取得できない可能性があります。
  • スタックインデックスの調整
    呼び出し階層が増えると、どのフレームが目的の関数かを慎重に確認する必要があります。

まとめ

実行中の関数名を取得する方法としては、inspect.currentframe()inspect.stack()traceback.extract_stack()が代表的です。

用途やパフォーマンス要件に応じて、それぞれの方法を使い分けると効率的に開発できます。

ログやエラーの解析などでは非常に便利なテクニックなので、上記の注意点を踏まえた上で活用してください。