Pythonで関数の呼び出し元のファイル名と行番号を表示させる方法
今回はPythonでエディタを使わずに関数の呼び出し元のファイル名と行番号を表示させる方法についてご紹介いたします。
Pythonで関数の呼び出し元のファイル名と行番号を表示させる方法
Pythonである関数の呼び出し元のファイル名と行番号を表示させたいときってありますよね。
プロジェクトとPython専用のエディタがリンクしているときはエディタの機能として関数の呼び出し元を特定する機能が備わっている場合がありますが、プロジェクトによってはエディタがリンクできず、ロガーを差し込むことでしか呼び出し元が特定できなかったりデバックができなかったりする場合があります。
そんなときに役立つのがinspectのモジュールです。
例として、次の「main.py」と「sub1.py」の二つのPythonファイルがあるとします。
1 2 3 4 5 6 |
#main.py import sub1 testString = '\ntest' print(sub1.sub1func(testString)) |
1 2 3 4 5 |
#sub1.py def sub1func(testString): testString += '\nSub1 passed' return testString |
中身は簡単な処理で、main.pyで用意した文字列にsub1.pyで文字列をくっつけて出力しているだけです。
プログラムの実行結果は以下のようになります。
1 2 |
test Sub1 passed |
さて、ここでinspectモジュールを使って関数の呼び出し元を特定してみます。
例としてここではsub1.pyのsub1funcがどこから呼び出されているか特定したい場合を想定してみます。(プログラムを見れば容易に分かると思いますが、sub1.pyのsub1funcが呼び出されているファイルはmain.pyです)
inspectモジュールをインポートしてsub1funcの中身に
inspect.currentframe().f_back.f_code.co_filename
と
inspect.currentframe().f_back.f_lineno
を差し込んでみます。
inspect.currentframe().f_back.f_code.co_filename
は呼び出し元のファイル名を出力する機能で、
inspect.currentframe().f_back.f_lineno
は呼び出し元のファイルの行数を出力する機能です。
詳しくは公式ドキュメントをご覧ください。
inspect — 活動中のオブジェクトの情報を取得する
inspectモジュールを組み込んだ全体のサンプルプログラムは以下になります。
1 2 3 4 5 6 |
#main.py import sub1 testString = '\ntest' print(sub1.sub1func(testString)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#sub1.py import inspect def sub1func(testString): testString += '\nSub1 passed' print('') print('呼び出し元のファイル') print(inspect.currentframe().f_back.f_code.co_filename) print('呼び出し元のライン') print(inspect.currentframe().f_back.f_lineno) return testString |
実際にこのプログラムを実行してみましょう。
printで文字列を出力した結果は以下のようになります。
1 2 3 4 5 6 7 |
呼び出し元のファイル /Users/chico27/github/python-test1/main.py 呼び出し元のライン 5 test Sub1 passed |
呼び出し元のファイル名とパス、呼び出し元の行数が出力されていることが見てとれますね。
エディタを使わずに関数の呼び出し元を特定したい場合はinspectモジュールを使うことを検討してみましょう。
終わりに
今回はPythonでエディタを使わずに関数の呼び出し元のファイル名と行番号を表示させる方法についてご紹介いたしました。
ディスカッション
コメント一覧
まだ、コメントがありません