間違いのないコードを書くには、とにかく「しつこくデバッグを行うこと」が必要です。うまく結果が出たと思っても、デバッガーで必ず途中過程を確認します。
そのためプログラミングには、デバッグしやすく、デバッグから情報を得やすい環境が必要です。PyCharmをオススメする理由の1つは、使いやすいデバッグインターフェースがあるからです。
デバッグがプログラミングに欠かせないのは、以下の3つが可能になるからです。
- 指定した行でプログラムを一時停止できる(ブレークポイントの配置)
- 一時停止した行の変数の値を確認できる
- 一時停止の後、プログラムを1行ずつ確認しながら続行できる(ステップ実行)
すなわち、プログラムの実行プロセスを詳細に確認できます。だから、デバッグを繰り返すと、プログラミングの理解も深まります。プログラミングの上達はデバッグなくしてありえません。
今回は、PyCharmを用いた一般的なデバッグの方法をWindows版で説明します。
この記事の目次
バグとエラーは区別して考えてください
バグとはプログラマによるプログラム上の「間違い」です。例えば、計算結果が期待した値と違う場合です。原因をデバッガーを使用して明らかにし、修正(デバッグ)します(バグ=虫を除去ともいいます)。
一方、エラーは大抵ユーザーによって引き起こされます。例えば、数値を入力すべき箇所に文字列を入力してしまう場合です。入力が正しいかをチェックして、適切に処理するコードを追加します。
このように、「バグは修正、エラーは処理」と区別して理解してください。なお、バグがエラーを発生させる場合がありますが、これは「コードの間違い」なのでバグです。
サンプルコードの準備
1. PyCharmで新しいプロジェクトを作成
まずPyCharmを起動して、以下の画面でCreate New Projectをクリックします。
次に、Demo
という名前のプロジェクトを作成します。以下の画面で Location: のフォルダー名にDemo
を入力します。
▼ Project Interpreter をクリックして画面を展開し、今回は仮想環境を使用しないので、Existing interpreter の方をチェックします。Interpreter: ではPython3.*(ここではPython3.6)を選択してください。
最後に Create をクリックすればプロジェクトが作成されます。
2. サンプルコードの作成
画面の左側の Project の部分で、Demo
を選択した状態で、Alt + Insert で以下のようにファイル新規作成ダイアログが表示されので、Python File を選択してください。
以下のダイアログが表示されるので、debug_demo
と入力して OK をクリックしてください。
debug_demo.py のエディターが開くので、以下のコードを入力してください。このプログラムは入力した値(n)に対して、1 + 2 + 3 +···+ n を計算するプログラムです(いわゆる等差数列の和を計算します)。
def sigma(n):
z = 0
for i in range(1, n):
z = z + i
return z
def main():
n = int(input('n = '))
result = sigma(n)
print(result)
main()
注意:上記のコードにはバグがあります
すぐに判ったかもしれませんが、上記のコードにはミスがあります。デバッガーを使いながらその原因を探ります。
エディターに入力した様子は、以下のようになります。
デバッグの開始方法
左のプロジェクトの部分で、debug_demo.py
を右クリックしてメニューを表示して、Debug 'debug_demo'
を選択します。
すると以下のように、デバッグ ツール ウィンドウ が開きコンソールタブが表示されて、デバッグモードになります。
実際に以下のように値を入力してみます。プログラムは完了し、デバッグモードも終了します。
上記の計算では、n=3 の答えは 3 と出力されましたが、正しくは
n = 3 の時、 1 + 2 + 3 = 6
と出力されなければなりません。すなわち、このプログラムにはバグがあります。以下でその原因を調べます。
次回からはデバッグボタンを利用できます
上記の方法で一度デバッグを実行すると、実行/デバッグプロセスが登録されます。ここでは、debug_demo.py
のデバッグなので、dubug_demo
というプロセス名が登録されます。他のPythonファイルをデバッグすれば、別のプロセス名が追加登録されます。
一度プロセスが登録されれば、以下のように対象のプロセス名を選択した状態で、虫マークのデバッグ開始ボタンをクリックすればデバッグを簡単に開始できます。
デバッグの手順(ブレークポイントの設置 ▶ ステップ実行)
一般的なデバッグは、「ブレークポイントによる停止」と「ステップ実行」の2つをうまく駆使して行います。ここはサンプルコードを用いてバグを見つけながら以下の順序で説明します。さらに、PyCharmの便利なデバッグ機能として、途中から対話モードで確認する方法についても説明します。
1. ブレークポイントの配置
まずプログラムを一時停止したい箇所にブレークポイントを配置します。
以下のようにコードと行番号の間の部分(ガーター)をクリックするとブレークポイント(赤丸)が配置されます。今回は以下の2箇所に配置します。
2. デバッグの開始
この状態でデバッグ開始ボタンをクリックして、デバッグを開始します。
次に Consoleタグに3
を入力してEnterを押します。すると、最初のブレークポイントで一時停止します。
9行目のn
の入力待ちを表すコードの末尾に、n:3 と表示されています。これは、n
には3が代入されていることを示しています。
このようにデバッグ中は、現在の変数の値が、行中に表示されます(インライン デバッギングと呼ばれます)。
3. 次のブレークポイントへ移動
以下のように、左端にある矢印のResume(回復)ボタンをクリックすると、次のブレークポイントに移動します。
4. ステップ実行で1行ずつ確認
ここからは、1行ずつ実行しながら確認します。
以下のようにStep Overボタンをクリックして、プログラムを1行進めます。for
文の箇所で、i
に1が代入されたのが確認できます。
さらにStep Overボタンを2回クリックしてみます。
1回目でfor
文に戻り、2回目でまたz = z + i
の演算に進みます。
このように、繰り返し処理を1ステップずつ確認することができます。i
は2になっているので、2回目の繰り返し処理であることがわかります。
続いて、もう2回Step Overボタンをクリックしてみます。
1回目でfor
文に戻りますが、2回目でz = z + i
を演算しないで、for
文を抜け出してしまいました。
すなわち、1 + 2 + 3
と計算するところを、1 + 2
までしか計算していません。バグが判明しました。繰り返す回数が1回足りないので、以下のように修正します。
def sigma(n):
z = 0
# nをn+1に修正
for i in range(1, n+1):
z = z + i
return z
以下略
このように、ブレークポイントとステップ実行をうまく利用してデバッグを行います。
途中から対話モードで確認すると便利!
Pycharmの便利なデバッグ機能として重宝するのが、プログラムを一時停止した状態で、対話モード(インタラクティブモード)を実行できることです。
以下のようにプロンプトボタンをクリックすると対話モードが開始します。
プログラムを一時停止した時点の変数をそのまま利用できます。
この例では、n
には3が代入されている状態でコードを試すことができます。以下のコードにより、range(1, n)
では2回しか繰り返し演算しないことがわかります。
対話モードを終了する場合は、もう一度プロンプトボタンをクリックします。exit()
を入力するとプログラム自体が途中で終了するので気をつけてください。