【Python】ファイル名、行番号、関数名を取得して表示する【デバッグ】
254, 2019-11-25
C ではマクロを使ってファイル名とか便利に表示できる。
#include <stdio.h> #define WARN(mes) { \ fprintf(stderr, "WARN: %s: %d: %s: %s\n", __FILE__, __LINE__, __func__, mes); \ } int main(void) { WARN("Hello, World!"); // WARN: test.c: 8: main: Hello, World! return 0; }
デバッグ時のログ取りとかで重宝。
Python3 でもできないか調べてみたら
http://stackoverflow.com/questions/6810999/how-to-determine-file-function-and-line-number
を見つけたので改造した。
import inspect from datetime import datetime def getframeinfo(stackIndex=2): """ @see http://stackoverflow.com/questions/6810999/how-to-determine-file-function-and-line-number @return frameInfo """ stack = inspect.stack() if stackIndex >= len(stack): return None callerframerecord = stack[stackIndex] frame = callerframerecord[0] info = inspect.getframeinfo(frame) return info def header(prefix, info): now = datetime.now() if info: return f'{str(now)}: {prefix:>6}: {info.filename}: {str(info.lineno)}: {info.function}(...):' else: return f'{str(now)}: {prefix:>6}:' def info(*args, **kwargs): head = header('INFO', getframeinfo()) print(head, *args, **kwargs) def warn(*args, **kwargs): head = header('WARN', getframeinfo()) print(head, *args, **kwargs) def error(*args, **kwargs): head = header('ERROR', getframeinfo()) print(head, *args, **kwargs) def main(): info('user is logged-in') warn('file is not found') error('permission error') if __name__ == '__main__': main()
↑のコードを実行すると↓のような結果になります。
2019-11-25 10:35:09.866388: INFO: .\a.py: 46: main(...): user is logged-in 2019-11-25 10:35:09.867386: WARN: .\a.py: 47: main(...): file is not found 2019-11-25 10:35:09.868384: ERROR: .\a.py: 48: main(...): permission error