UMEHOSHI ITA TOP PAGE    COMPUTER SHIEN LAB

micro pythonやpythonで使えるデバックモジュールの紹介

下記で使っているumedebug.pyのソースはこれをクリックしてください。

デバックは自分が予想している通りの順番で、処理を進行しているかを確かめることで行います。
統合開発環境(IDE)でブレークポイントを指定してトレースで確かめる方法は便利で、様々なIDEが在ります。
しかし、複雑な処理でこれを行っても不具合を見つけることが困難な場合が多いと感じます。
経験的にそんな場合は、条件で実行させるprint命令を埋め込んで、やっと見つかる場合が多いと、感じます。
そんな場合の時に使えるのが、条件で表示するためのモジュールがumedebug.pyで、その使い方のイメージを示します。

コピーして使ってください。
# 実行の順番を確認するためのデバック用の、このモジュール確認用

from umedebug import debug_hex4

dflags=[False]*20 # デバックで使うフラグ変数

for i in range(4):
    ss=input("ある入力>>>")
    if "A" == ss: 
        print("実行したかどうか判明できない複雑な処理がここにある。と考えてください。")
        dflags[1]=debug_hex4(nn=1, data="nn=0の処理を経由して、ここに至る。", enable=dflags[0])
    elif "B" == ss: 
        print("実行したかどうか判明できない複雑な処理がここにある。と考えてください。")
        dflags[0]=debug_hex4(nn=0, data=0b0001, enable=True)
    elif "C" == ss: 
        print("実行したかどうか判明できない複雑な処理がここにある。と考えてください。")
        dflags[2]=debug_hex4(nn=2, data=0b1010, enable=dflags[1])

import umedebug
print("通過したかのどうかの情報")
print(umedebug.debug_memo_hex4)
以下に実行例を示します。上記コードは、Bの入力の後で、Aの入力を行って、その後にCの入力をしているかを確認しているコードです。
ある入力>>>A
実行したかどうか判明できない複雑な処理がここにある。と考えてください。
ある入力>>>B
実行したかどうか判明できない複雑な処理がここにある。と考えてください。
#####ID:00: ...- #####

ある入力>>>A
実行したかどうか判明できない複雑な処理がここにある。と考えてください。
#####ID:01 nn=0の処理を経由して、ここに至る。

ある入力>>>C
実行したかどうか判明できない複雑な処理がここにある。と考えてください。
#####ID:02: -.-. #####

通過したかのどうかの情報
[True, True, True, False, False, False, False, False, False, False]

最初のAの入力だけでは「nn=0の処理を経由して、ここに至る。」の表示が出ていません。
それは、まだBの入力が行われていないためです。それは次のdflags[0]がTrueになっていないからです。
dflags[1]=debug_hex4(nn=1, data="nn=0の処理を経由して、ここに至る。", enable=dflags[0])
このように、debug_hex4は第3引数がTrueの場合だけ、第2引数の表示を行う能力です。
表示は何回実行しても、最初の一回だけしか表示しません。この一度の表示で戻り値がTrueになります。
debug_hex4は次のようなイメージの命令を行うものと考えることができます。

if 通過を記録しているか==False and 3引数の記録フラグ:
    print( "#####ID:第1引数と、第2引数の通過したことを示す文字列" )
    通過を記録しているか=True

なお、第1引数は識別用IDです。(出力画面を#####ID:で検索する使い方ができます。)
また第2引数が整数の場合は、下位4ビットだけの2進表示になります。
次のように使うと、コピペで通過順を10か所まで確認できます。

from umedebug import debug_hex4
dflags=[False]*20 # デバックで使うフラグ変数
id_nn=0


dflags[0]=debug_hex4(nn=0, data=0b0000, enable=True) ; id_nn+=1 # 最初の確認位置
・・・
dflags[id_nn]=debug_hex4(id_nn, id_nn,dflags[id_nn-1]); id_nn+=1 # この行のコピペ

この第2引数がintの場合の2進表示は、1が-で、0が.の表示です。
実は「UMEHOSI ITA」にも似ているデバック関数が用意されており、
-が長音、.が短音で知らせる方法で、 複雑な流れの順番で、自分の思う通りにプログラムが進んでいるかを確認できます。

umedebug.pyのコード

コピーして使ってください。(使い方は上記に示してあります。)
# umedebug.py
# A simple module for checking the order of execution

ERROR_INFO_ARRAY_SIZE=10 # Number of ID number storage areas to use in hex4
debug_memo_hex4=[False]*ERROR_INFO_ARRAY_SIZE # 

def debug_hex4(nn: int, data, enable : bool ) -> bool: 
    ''' nn is registration ID (Specify 0 to 9), data is for display, Allow registration with enable '''
    if nn >= ERROR_INFO_ARRAY_SIZE: return False
    if not enable: return False
    if debug_memo_hex4[nn]: return True; #Already registered
    #
    # If not registered, register and display
    debug_memo_hex4[nn] = True
    if type(data) is int:
        print(f"#####ID:{nn:02}",  end=": ")
        bit = 8
        while bit != 0:
            print('-' if data & bit else '.' , end="")
            bit >>=1
        print(" #####\n")
    else: print(f"#####ID:{nn:02}",data+"\n")
    return True