tkdebug.py ライブラリ ドキュメント
ライブラリの機能や目的
tkdebug.py は、Pythonプログラムにおけるデバッグ出力を簡素化し、その方法を柔軟に切り替えるための軽量なライブラリです。主な目的は、開発者がデバッグメッセージを print 関数のような感覚で記述できるAPI (dbg) を提供しつつ、その出力を標準出力(コンソール)へ行うか、ログファイルへ行うかを簡単に設定できるようにすることです。
このライブラリは以下の課題を解決します。
デバッグ出力の切り替え: デバッグレベルの設定一つで、デバッグメッセージをコンソールに出力するか、ログファイルに出力するかを瞬時に切り替えられます。
情報付加: デバッグメッセージに、呼び出し元のファイル名、行番号、および現在の時刻を自動的に付加し、デバッグ作業の効率を高めます。
簡易API: 標準の
print関数と類似したAPI (dbg) を提供することで、デバッグコードの記述を直感的で簡単なものにします。
importする方法
tkdebug.py ファイルをプロジェクトの適切なディレクトリに配置し、標準的なPythonモジュールとしてインポートします。
# ライブラリ全体をインポートする場合
import tkdebug
# 特定の関数のみをインポートする場合
from tkdebug import dbg, set_debug
必要な非標準ライブラリとインストール方法
tkdebug.py はPythonの標準ライブラリのみを使用しており、inspect, logging, os, sys, datetime, typing などは全てPythonに標準で含まれています。
したがって、別途 pip コマンドなどを用いた非標準ライブラリのインストールは不要です。
importできる変数と関数
変数
DEBUG_LEVEL: intデバッグ出力のレベルを制御するグローバル変数です。
0: デバッグ出力を無効にします。dbg関数を呼び出しても何も出力されません。1: デバッグ出力を標準出力(コンソール)に行います。print関数と同様の動作をします。2: デバッグ出力をログファイルに行います。loggingモジュールを通じてLOG_FILEで指定されたファイルに書き込まれます。初期値は
1です。
LOG_FILE: strDEBUG_LEVELが2(logging出力)に設定されている場合に使用されるログファイルのパスです。初期値は
"debug.log"です。
関数
set_debug(level: int | None = None, log_file: str | None = None) -> None動作: デバッグ出力の設定(
DEBUG_LEVELとLOG_FILE)を変更します。log_fileが変更された場合、loggingモジュールの設定を再初期化し、新しいログファイルへの出力が有効になるようにします。logging.basicConfigは通常最初の呼び出ししか有効ではないため、この関数では既存のハンドラを閉じて削除し、再度basicConfigを呼び出すことで設定を更新しています。引数:
level (int | None): 新しいデバッグレベルを設定するための整数値 (0,1,2)。Noneが指定された場合は、現在のDEBUG_LEVELの設定が維持されます。log_file (str | None): 新しいログファイルのパスを設定するための文字列。Noneが指定された場合は、現在のLOG_FILEの設定が維持されます。ログファイル名が変更された場合のみ、loggingの設定が再ロードされます。
戻り値:
None。
dbg(*msgs: Any, sep: str = " ", end: str = "\n", flush: bool = False) -> None動作:
print関数に似た形式でデバッグメッセージを出力します。DEBUG_LEVELの設定に応じて、標準出力またはログファイルに出力先が切り替わります。メッセージの前に、現在の時刻、呼び出し元のファイル名、および行番号が自動的に付加されます。DEBUG_LEVELが0以下の場合、この関数は何も出力しません。また、inspect.currentframe()を使用したフレーム参照は、循環参照を防ぐために明示的に解放されます。引数:
*msgs (Any): 出力する任意の数のオブジェクト。printと同様に複数の値を渡すことができます。これらのオブジェクトは文字列に変換され、sepで指定された区切り文字で結合されます。sep (str): 複数のメッセージを結合する際に使用される区切り文字。デフォルトは半角スペース (" ") です。end (str): メッセージの末尾に追加される文字列。デフォルトは改行文字 ("\n") です。DEBUG_LEVELが2(logging出力)の場合、ログシステムが改行を処理するため、この引数は内部的に吸収されます。flush (bool):DEBUG_LEVELが1(print出力)の場合にのみ有効です。Trueに設定すると、出力バッファが強制的にフラッシュされます。デフォルトはFalseです。logging出力には影響しません。
戻り値:
None。
main scriptとして実行したときの動作
tkdebug.py が直接Pythonインタープリタによって実行された場合 (python tkdebug.py)、以下のデモンストレーションコードが実行されます。このコードは、set_debug と dbg 関数の基本的な使用方法と、異なるデバッグレベルでの動作を示します。
初期設定: まず、
set_debug(level=1)が呼び出され、DEBUG_LEVELが1(print出力モード) に設定されます。printモードでの出力:
dbg("start")により、startというメッセージがコンソールに出力されます。変数
x=10とy=3.14が定義され、dbg("x =", x, "y =", y)によりx = 10 y = 3.14のように、時刻、ファイル名、行番号のプレフィックスと共にコンソールに出力されます。dbg("i=", 5, " j=", 9, sep="")により、sep=""の指定が適用され、i=5 j=9のように区切り文字なしで結合されたメッセージがコンソールに出力されます。dbg("done", flush=True)により、doneメッセージが出力され、出力バッファが強制的にフラッシュされます。
loggingモードへの切り替え:
set_debug(level=2, log_file="debug.log")が呼び出され、DEBUG_LEVELが2(logging出力モード) に、LOG_FILEが"debug.log"に設定されます。この際、loggingモジュールの設定が更新され、既存のログハンドラが閉じられて新しいログファイルに紐付けられます。loggingモードでの出力:
dbg("これは logging に出ます")が呼び出され、"debug.log"ファイルに[時刻 ファイル名:行番号] これは logging に出ますという形式でログが記録されます。
この実行により、コンソールには最初の dbg 呼び出し群の結果が表示され、同時に debug.log ファイルが生成され、最後の dbg 呼び出しの結果が記録されます。
# コンソール出力例 (時刻とファイル名は実行環境により異なる)
[HH:MM:SS tkdebug.py:64] start
[HH:MM:SS tkdebug.py:65] x = 10 y = 3.14
[HH:MM:SS tkdebug.py:66] i=5 j=9
[HH:MM:SS tkdebug.py:67] done
# debug.log の内容例 (時刻とファイル名は実行環境により異なる)
YYYY-MM-DD HH:MM:SS,ms DEBUG [HH:MM:SS tkdebug.py:71] これは logging に出ます