22
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonで関数の呼び出し元を取得する

Last updated at Posted at 2020-06-01

やりたいこと

処理中の関数を呼び出したファイル名・関数を取得したい。

方法

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] でも良い。

参考

22
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?