実行中の情報を得るには、標準ライブラリの inspect モジュールを使用します。
実行中の関数名・メソッド名を取得する方法
import inspect
関数名・メソッド名 = inspect.currentframe().f_code.co_name
- 関数の外では '<module>' が返されます。
- 無名関数内では '<lambda>' が返されます。
- クラス定義内では、クラス名が返されます。
- クラスのメソッド内では、メソッド名が返されます。クラス名は含まれません。
import inspect
print('関数の外 = ' + inspect.currentframe().f_code.co_name)
# 結果 = '<module>'
def TestFunction(lambdaFunction):
print('関数内 = ' + inspect.currentframe().f_code.co_name)
# 結果 = 'TestFunction'
# 無名関数の実行
lambdaFunction()
class BaseClass:
print('基底クラス定義内 = ' + inspect.currentframe().f_code.co_name)
# 結果 = 'BaseClass'
def __init__(self):
print('基底クラスのコンストラクタ内 = ' + inspect.currentframe().f_code.co_name)
# 結果 = '__init__'
def __del__(self):
print('基底クラスのデストラクタ内 = ' + inspect.currentframe().f_code.co_name)
# 結果 = '__del__'
class SubClass(BaseClass):
print('派生クラス定義内 = ' + inspect.currentframe().f_code.co_name)
# 結果 = 'SubClass'
def __init__(self):
print('派生クラスのコンストラクタ内 = ' + inspect.currentframe().f_code.co_name)
# 結果 = '__init__'
def __del__(self):
print('派生クラスのデストラクタ内 = ' + inspect.currentframe().f_code.co_name)
# 結果 = '__del__'
if __name__ == '__main__':
print('__main__ 内 = ' + inspect.currentframe().f_code.co_name)
# 結果 = '<module>'
# 関数と、無名関数の実行
TestFunction(lambda: print('無名関数内 = ' + inspect.currentframe().f_code.co_name))
# コンストラクタとデストラクタを実行
BaseClass()
SubClass()
サンプルコードの実行結果
関数の外 = <module>
基底クラス定義内 = BaseClass
派生クラス定義内 = SubClass
__main__ 内 = <module>
関数内 = TestFunction
無名関数内 = <lambda>
基底クラスのコンストラクタ内 = __init__
基底クラスのデストラクタ内 = __del__
派生クラスのコンストラクタ内 = __init__
派生クラスのデストラクタ内 = __del__
sys._getframe() との違い
sys._getframe() を使用しても同様の結果が得られる場合がありますが、 sys._getframe() が存在することは保証されていません。import sys
関数名・メソッド名 = sys._getframe().f_code.co_name
検証環境
- Python 3.9.0 (tags/v3.9.0:9cf6752, Oct 5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32
- Microsoft Windows 10 Pro Version 20H2 OS Build 19042.844 Experience: Windows Feature Experience Pack 120.2212.551.0