Pythonデバッグマスター:効率的なテクニックとベストプラクティス
print文によるデバッグ
多くの人にとって、Pythonコードのデバッグはprint文を追加し、出力に基づいて何が起きているか推測することに帰着します。理想的ではありませんが、何らかの理由で人々はPythonデバッガーに触れたがりません。
決して批判しているわけではありません。 Python学習は難しい。プログラミングは難しい。人生は難しい。すでに苦労している時に、さらに新しいことを学ぶのが億劫なのは理解できます。print文をコードに追加するのは……ただ簡単なのです。小さな告白:私も今でも頻繁にやっています。一部の人が言うほど悪いことではありません。
しかし、print文追加と同じくらい簡単な、ある小さなトリックを教えましょう。このトリックは無限のデバッグパワーを与え、必要なら世界征服さえ可能にします。
Pythonデバッガーブレークポイントの設定
コードを適切にデバッグするためにIDEは必要ありません。このトリックは、最もシンプルなエディターでも、Jupyter Notebookでも常に機能します。
トリックの核心は、breakpoint()命令を使っていわゆるブレークポイントを設定することです。通常print文を置く場所ならどこでも、エディターやIDEを問わずコードに挿入できます。
では、何が起きるでしょうか? 試してみましょう! 以下のようなシンプルなプログラムを作成します:
def add_two(x):
return x + 2
for i in range(1, 10):
a = add_two(i)
breakpoint()
print(a)
これを実行すると(REPL、コマンドライン、IDEのいずれでも)、PythonデバッガーであるPDBにドロップインします。さて、次は?
Pythonデバッガーの使用
上記の小さなプログラムを開始すると、以下のようになります:
$ python3 breakpointing.py
> /home/erik/breakpointing.py(7)<module>()
-> print(a)
(Pdb) _
ここでいくつか確認できます:
- 開始された現在のファイル(
breakpointing.py)が表示される - その次に、
breakpoint()呼び出しによって中断された、次に実行予定だったコマンドが表示される - 最後にPDBプロンプトが表示され、入力を待機している
Pythonデバッガーは実際、REPLと同様に完全に機能するPythonシェルです。
この時点で現在の環境を検査できます。今、aの値がどうなっているか見てみましょう:
(Pdb) print(a)
3
(Pdb) print(i)
1
printの代わりに、PDB固有のコマンドpも使えます:
(Pdb) p a
3
(Pdb) p i
1
次の行を実行する
次の行のコードを実行したい場合、2つのオプションがあります:
sまたはstep:現在の行を実行。デバッガーはその後最初に可能な時点で停止。nまたはnext:現在の行を実行するが、今度は現在の関数の次の行に達するまで継続。
これをより明確にするため:stepは関数呼び出しに喜んで入り、その関数内部でブレークします。対照的に、nextは関数が戻るまで実行し、次の行でブレークします。
他のデバッガーやIDEでは、これらは「ステップイン」(step代わり)と「ステップオーバー」(next代わり)と呼ばれます。
これらを試してみましょう:
$ python3 breakpointing.py
-> print(a)
(Pdb) s
3
-> for i in range(1, 10):
(Pdb) s
-> a = add_two(i)
(Pdb) n
-> breakpoint()
(Pdb) n
-> print(a)
(Pdb) n
4
-> for i in range(1, 10):
(Pdb) s
-> a = add_two(i)
(Pdb) s
--Call--
-> def add_two(x):
(Pdb) s
-> return x + 2
(Pdb) s
--Return--
5
-> return x + 2
(Pdb) s
-> breakpoint()
(Pdb)
ご覧の通り、最初にnでadd_two呼び出しをステップオーバーし、2回目にsで関数内部へステップインしています。
Pythonデバッガーコマンド
自分で試せるコマンドは他にもあります。すべてを列挙せず、最も有用なものを紹介します:
h(help):利用可能なすべてのコマンドを表示。引数を取ることも可能、例:h cでcコマンドの説明表示c(continue):次のブレークポイントまで実行継続l(list):現在行周辺のソースコードを表示p:式の結果を表示。print()呼び出しの代わりに使用可能pp:プリティプリント。辞書などデータ構造の表示に有用restart:現在のプログラムを再起動
完全なドキュメントは、すべてのコマンドが列挙されているPythonデバッガーページを参照してください。
学びを続ける
この方法は非常に便利ですが、お使いのIDEが提供するデバッガーを深く掘り下げる価値があります。VSCodeユーザーの方は、VSCodeでのPythonコードデバッグ方法についてのチュートリアルを書きました。
Python
- 保全合理化でプラント効率向上
- PCB設計を極める:エンジニア必携のヒントとベストプラクティス
- 生産加速:試作が製造プロセスをどう強化するか
- 板金部品品質を高める5つの実証済み戦略
- 産業機器メンテナンス計画を向上させる3つの実証済み戦略
- フォードの拡張コネクテッド・フリート管理で利益を最大化
- Python I/Oとモジュールインポート完全マスター: 実践ガイド
- Python print()関数の実践ガイド:基本から応用まで
- Python文字列操作マスター:replace、join、split、reverse、大文字小文字変換
- Python time.sleep():コードに遅延を追加する方法(例付き)
- Python print()で改行なし出力:endパラメータとその他のテクニック