StoryEdit 開発日誌

ウェブアプリ StoryEditを作ってましたが延期。普通のブログ。

Pythonでデバッグprint関数を作る

C言語なんかではマクロでデバッグ関数を定義して,printfデバッグに,ファイル名と行数を出力させたりしますね.Pythonでも同じように,デバッグprintfの関数を作ってみました.

#debug.py
__all__ = ["D"];

import inspect;

DEBUG=True;

def _debug(msg) :
	fr = inspect.currentframe();
	try:
		fr = fr.f_back;
		if fr is None:
			print "[nocaller]" + msg;
		fi = inspect.getframeinfo(fr, 0);
		if fi[2] =='<module>':
			print "[%s:%d]" % (fi[0], fi[1]) + msg;
		else:
			print "[%s() [%s:%d]" % (fi[2], fi[0], fi[1]) + msg;
	finally:
		del fr;

if DEBUG is True:
	D = _debug;
else:
	D = lambda message: message;


inspectというモジュールを使えば,スタックフレームを覗けるので,そこに積まれているCallee(呼び出しもと)の情報をとってくることができますね.
で,_debugという関数を,DEBUG変数の真偽で切り替えます.外には"D"という関数を公開して,その中身を切り替える訳ですね.デバッグモードでないときは,単に無視されるような関数を定義しています.