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"という関数を公開して,その中身を切り替える訳ですね.デバッグモードでないときは,単に無視されるような関数を定義しています.