以下の内容はhttps://pydocument.hatenablog.com/entry/2023/03/19/232428より取得しました。


Pythonデバッグの基本と実践的なテクニック: ツールやデバックのコツを紹介

この記事では、Pythonデバッグに焦点を当て、効率的に問題を特定し解決するためのツール、コマンド、実践的なポイントを解説します。主にPythonの基本的なデバッグツールと、printデバッグassert文、tracebackモジュールの利用方法に焦点を当てて解説していきます。

print文によるデバッグ

最もシンプルで直感的なデバッグ方法は、print文を使用することです。 プログラムの特定の位置で変数の値や実行フローを確認できます。

def calculate_average(numbers):
    print(f"入力値: {numbers}")  # 入力値を確認
    total = sum(numbers)
    print(f"合計値: {total}")  # 合計値を確認
    count = len(numbers)
    print(f"要素数: {count}")  # 要素数を確認
    average = total / count
    print(f"平均値: {average}")  # 平均値を確認
    return average

data = [1, 2, 3, 4, 5]
result = calculate_average(data)
print(f"結果: {result}")

デバックのポイント

print文は、処理の途中経過や変数の状態を簡単に把握するのに役立ちます。ただし、print文を多用すると出力が多くなり、重要な情報が見つけにくくなる可能性があります。本番環境では不要なprint文は削除するか、コメントアウトしましょう。

assert文によるデバッグ

assert文は、プログラムの特定の位置で条件が満たされているかをチェックするために使用します。 条件がFalseの場合、AssertionErrorが発生し、プログラムの実行が停止します。

def divide(a, b):
    assert b != 0, "0で割ることはできません"
    return a / b

# 例1: 正常なケース
result1 = divide(10, 2)
print(f"結果1: {result1}")

# 例2: 異常なケース (AssertionErrorが発生)
# result2 = divide(10, 0)
# print(f"結果2: {result2}")

デバックのポイントポイント

assert文は、開発中に前提条件や不変条件をチェックするのに有効です。-Oオプションを付けてPythonを実行すると、assert文は無視されます。

tracebackモジュールによるスタックトレースの確認

tracebackモジュールは、例外が発生した際に詳細なスタックトレースを提供します。これにより、エラーが発生した箇所とその原因を特定しやすくなります。

import traceback

def function_a():
    return function_b()

def function_b():
    return function_c()

def function_c():
    raise ValueError("function_cでエラーが発生しました")

try:
    function_a()
except Exception:
    traceback.print_exc()

出力例

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    function_a()
  File "test.py", line 4, in function_a
    return function_b()
  File "test.py", line 7, in function_b
    return function_c()
  File "test.py", line 10, in function_c
    raise ValueError("function_cでエラーが発生しました")
ValueError: function_cでエラーが発生しました

デバックのポイント traceback.print_exc() は、例外が発生したコンテキストで呼び出すと、詳細なスタックトレース標準エラー出力に出力します。より詳細な制御が必要な場合は、traceback.format_exc() を使用してスタックトレースを文字列として取得できます。

対話型デバッガ (pdb, ipdb)

pdb (Python Debugger)

pdbPython標準の対話型デバッガです。 プログラムの実行を一時停止し、変数の値を確認したり、ステップ実行したりできます。

pdbの基本的な使い方

  1. import pdb でモジュールを追加します。
  2. ブレークポイントを設定したい箇所に pdb.set_trace() を挿入します。
import pdb

def my_function(x, y):
    pdb.set_trace() # ブレークポイント
    z = x + y
    return z
   
result = my_function(3,5)
print(result)
  1. プログラムを実行します。pdb.set_trace() の位置で実行が一時停止し、pdbのプロンプトが表示されます。

主なpdbコマンド

コマンド 説明
h(elp) ヘルプを表示
n(ext) 次の行へ進む
s(tep) 次の行へ進む(関数の中に入る)
c(ontinue) 実行を再開(次のブレークポイントまで)
b(reak) ブレークポイントを設定/確認/削除
l(ist) ソースコードを表示
p(rint) 変数の値を表示
w(here) スタックトレースを表示
q(uit) デバッガを終了
r(eturn) 現在の関数の最後まで実行し、関数を抜けた所で停止する
!<python命令> 現在のコンテキストでPythonの命令を実行する。変数の値を変更したり、関数の結果を確認する際に使用します。

ipdb (IPython-enhanced pdb)

IPythonをベースにしたpdbの拡張版です。pip install ipdbでインストールします。pdbとほぼ同じように使用できますが、以下の点が強化されています。

  • 構文ハイライト
  • タブ補完
  • より良いイントロスペクション

IDEデバッグ機能 (PyCharm, VSCode)

多くの統合開発環境IDE)は、強力なデバッグ機能を備えています。ここでは、PyCharmとVSCodeを例に簡単に説明します(ツールのUIは頻繁に変わりますので、適宜最新の情報を調べてください)。

PyCharm

  1. ブレークポイントの設定 コードの行番号の左側をクリックして、ブレークポイントを設定します。
  2. デバッグモードの開始 ツールバーの虫のアイコンをクリックするか、Shift + F9 (macOS) / Shift + Alt + F9 (Windows/Linux) を押してデバッグモードを開始します。
  3. ステップ実行、変数の確認 デバッグツールウィンドウで、ステップ実行、変数の値の確認、式の評価などが行えます。

VSCode

  1. ブレークポイントの設定 PyCharmと同様に、コードの行番号の左側をクリックしてブレークポイントを設定します。
  2. デバッグ構成の作成 .vscode/launch.json ファイルを作成し、デバッグ構成を定義します。
  3. デバッグの開始 F5キーを押すか、サイドバーの実行アイコンからデバッグ構成を選択し、実行します。
  4. ステップ実行、変数の確認 デバッグコンソールや変数ビューで、ステップ実行、変数の値の確認、ウォッチ式の追加などが行えます。

まとめ

本記事では、Pythonデバッグにおける基本的なツールとテクニックについて解説しました。print文、assert文、tracebackモジュール、そして対話型デバッガ(pdb, ipdb)、IDEデバッグ機能と様々な方法がありますので、問題の大きさや複雑さに応じて利用してください。また、容易にテスト、デバックができるよう、日頃から小さな単位で開発、動作を確認することが重要です。




以上の内容はhttps://pydocument.hatenablog.com/entry/2023/03/19/232428より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14