やりたいこと
処理中の関数を呼び出したファイル名・関数を取得したい。
方法
inspectを使う。
やりかた
caller_file.py
import callee_file
def main():
callee_file.callee_function()
main()
callee_file.py
import inspect
def callee_function():
# print(inspect.stack())
print(inspect.stack()[1].filename)
print(inspect.stack()[1].function)
inspect.stackには呼び出しが遅い順に格納されている。
4行目のコメントアウトを外すと以下の配列が出力される。
[
FrameInfo(frame=<frame at 0x7fa68460f050, file '/path-to-dir/callee_file.py', line 4, code callee_function>, filename='/path-to-dir/callee_file.py', lineno=4, function='callee_function', code_context=[' print(inspect.stack())\n'], index=0),
FrameInfo(frame=<frame at 0x10cc17650, file 'caller_file.py', line 5, code main>, filename='caller_file.py', lineno=5, function='main', code_context=[' callee_file.callee_function()\n'], index=0),
FrameInfo(frame=<frame at 0x10ca61450, file 'caller_file.py', line 8, code <module>>, filename='caller_file.py', lineno=8, function='<module>', code_context=['main()\n'], index=0)
]
1つめが callee_file.py4行目の print(inspect.stack())
の情報、
2つめが caller_file.py5行目の callee_file.callee_function()
の情報
3つめが caller_file.py8行目の main()
の情報である。
1つ前の関数呼び出しの情報がほしいので、配列2つめの情報を取得するため inspect.stack()[1]
となる。
inspect.stack()[1]
のプロパティは以下の通りだが、今回はファイル名と関数名を取得できればいいので
inspect.stack()[1].filename
, および inspect.stack()[1].function
を利用する。
ちなみに、配列の番号でも取得できるので inspect.stack()[1][1]
, および inspect.stack()[1][3]
でも良い。
参考