見出し画像

Python基礎9:デバッグ

1.緒言

 Pythonのデバッグに関して紹介します。一般的には①スクリプト実行・エラー発生、②エラー文確認、③エラーの原因分析、④コード修正、⑤再実行となります。
 特にエラーの原因分析を効果的に実行するための手法/ライブラリを紹介します。

2.assert文

 assert文の紹介に関しては下記記事がわかりやすいです。

2-1.概要

 assert文は条件分岐でFalseが出たときに記載した文章を出力することができます。よってIf文を記載しなくても”True/Falseの判定+文字出力”を1文で記載できます(エラー文は省略可)。

[assert文]
assert <条件文>, <False時に出力する文章>

 下記で簡易に動作を確認しました。Trueの場合はエラーが出ませんが、Falseになると指定した文章に合わせてErrorが発生します。

[IN1]
assert True, 'エラーですよ'
print('end')

[OUT1]
end


[IN2]
assert False, 'エラーですよ'
print('end')

[OUT2]
AssertionError                            Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_444/1936375518.py in <module>
----> 1 assert False, 'エラーですよ'

AssertionError: エラーですよ

 Bool型のFalseで反応するため下記でもErrorを出力できます。

[IN ※エラー文省略]
assert False
assert 1==2
assert ''
assert 0
assert None
assert []

[OUT ※すべて同じ出力]
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_444/2311582799.py in <module>
----> 1 assert 0

AssertionError: 

2-2.応用

 追って

3.pdb/ipdbライブラリ

3-1.概要

 デバッグ用ライブラリのpdb/ipdb(pdbの高度版)では関数に対して行ごとの実行や実行中の変数の確認などが可能となります。
 pdbの記法としては動作確認したいコードの前後に"pdb.set_trace()"を挟みます。

[サンプルコード]
import pdb

def func():
        ~処理~
        pdb.set_trace() #チェックポイント(デバッグ用)
        ~処理~

 実行時はコマンドを入力して動きを制御します。コマンドは下記の通りであり、今回はn, c, l, qコマンドを紹介します。

3-2.基礎構文

 動作を確認するためにサンプル関数を作成しました。

[IN]
def countnums(num:int, x:str):
    if num <= 0:
        return f'0以上の整数を入力してください。'
    idx = 0
    
    while num != 0:
        print(1, x)
        num -= 1
        idx += 1
        print(f'{idx}回目:{num}')
        print(2, x) #確認用1
    return num
    
countnums(3, 'checkpoint')

[OUT ※最後の0return numの値]
1 checkpoint
1回目:2
2 checkpoint
1 checkpoint
2回目:1
2 checkpoint
1 checkpoint
3回目:0
2 checkpoint

0

 上記の関数にデバッグ用として"pdb.set_trace()"を埋め込みました。こちらで動作確認します。

[IN]
import pdb

def countnums(num:int, x:str):
    if num <= 0:
        return f'0以上の整数を入力してください。'
    idx = 0
    
    while num != 0:
        print(1, x)
        pdb.set_trace() #チェックポイント(デバッグ用)
        num -= 1
        idx += 1
        print(f'{idx}回目:{num}')
        print(2, x) #確認用1
    return num
    
countnums(3, 'checkpoint')

[OUT]

 実際にコードを動かすと下図の通りコマンド入力ボックスが出ます。ここに実行したいコマンドを入力します。参考として"n","c"の動作は下図に示します。

 動作として「n, n, n, c, l ,q」の順で実行した結果は下記の通りです。

4.logging

 十分に理解できてから記載予定



参考資料

あとがき

 追って修正 



この記事が気に入ったらサポートをしてみませんか?