ブレークポイント、ステップ実行など、本格的なIDEと遜色ない機能を使って、VS CodeでPythonコードをデバッグしよう。
連載「Visual Studio Codeで始めるPythonプログラミング」
前回はVisual Studio Code(以下、VS Code)でPythonコードを記述する上での基本を見た。今回はVS Code+Python拡張機能がサポートしているデバッグ機能について見ていこう。
ここではフィボナッチ数を計算する関数を定義して、それをデバッグしていくことにしよう。なお、本稿ではフィボナッチ数を以下のようなものとする。
例えば、「F2=F1+F0=1+0=1」「F3=F2+F1=(F1+F0)+F1=1+0+1=2」となる(Webページを検索しているとF0=1とする記述も多くあるが、ここではF0=0としている)。このようにして得られる数列を「フィボナッチ数列」と呼ぶ。最初の数個を列挙すると「0, 1, 1, 2, 3, 5, 8, 13, 21, ……」のようになる。
以下に示す関数fib1は上に示したフィボナッチ数の定義を素直にPythonコードに書き下ろしたもので、関数fib2は再帰呼び出しを止めてループを使うようにしたものだ(詳細は割愛するが、n番目のフィボナッチ数の計算にはn-1番目とn-2番目のフィボナッチ数があればよいので、それを記憶しておき、ループでフィボナッチ数を計算するようにしている)。最後にそれらを呼び出して、最初の10個のフィボナッチ数を表示している。
def fib1(n):
if n == 0:
return 0
if n == 1:
return 1
return fib1(n - 1) + fib1(n - 2)
def fib2(n):
n0, n1 = 0, 1
for cnt in range(n):
n0, n1 = n1, n0 + n1
return n1
print('call fib1')
for x in range(10):
print(f'{fib1(x)}, ', end='')
print()
print('call fib2')
for x in range(10):
print(f'{fib2(x)}, ', end='')
なお、本稿では仮想環境「venv」を作成して、それをワークスペースのPython環境として指定してある。
関数fib2ではforループ中で定義した変数cntに波線が引かれ、[エクスプローラー]ビューにはsample.pyファイルに緑色で「1」と表示があることに注意されたい。これはpylintが生成したもので、波線にマウスカーソルを合わせると「Unused variable 'cnt'」というメッセージがポップアップ表示される(画像は割愛)。また、関数fib2と関数fib1の振る舞いには少々違いがあるので(本稿でのフィボナッチ数の定義と少し異なる部分がある)、上記の変数cntの扱いも含めて、本稿では関数fib2のコードをデバッグしながら修正してみよう。
VS Codeのアクティビティーバーで[デバッグ]アイコンをクリックすると、サイドバーに[デバッグ]ビューが表示される。このビューでは、デバッグ実行を開始、デバッグ実行の構成などを行うアイコンが一番上に表示され、その下にプログラム実行中に可視な変数の値を表示する[変数]ウィンドウ、プログラマーが任意の式を評価するための[ウォッチ式]ウィンドウ、関数の呼び出し履歴を表示する[コール スタック]ウィンドウ、プログラムをステップ実行するために設定するブレークポイントを一覧する[ブレークポイント]ウィンドウがある。この他に、「デバッグコンソール」を統合ターミナルから利用可能だ。
[デバッグ]ビューにある各種ウィンドウやデバッグターミナルの使い方については後で見ていくとして、取りあえずデバッグ実行をするだけなら、[デバッグ]ビュー上部にある緑色の三角形のボタン(以下、[デバッグの開始]ボタン)をクリックすればよい。その隣にあるドロップダウンではデバッグ実行の構成を行っていれば、それらが表示される。その隣の歯車ボタンが構成を行うためのボタンだ。その隣にはデバッグコンソールを表示するボタンがある。
というわけで、[デバッグの開始]ボタンをクリックしてみよう([F5]キーを押してもよい)。ここでは何の構成も行っていないので、次のように[環境の選択]を行うメニューが表示される。ここでは[Python]を選択する。[Python Experimental]は現在進行形で開発が進められているPythonのデバッガーパッケージを使用するものだが、本稿では取り上げない。
ブレークポイントを設定していないので、上に示したコードがそのまま実行され、結果が統合ターミナルに開かれた「Python Debug Console」に表示される。結果を見ると関数fib1を呼び出した場合と、関数fib2を呼び出した場合で初項(0番目のフィボナッチ数)が異なっていることが分かる。他は同様なので、後でこれを解決することにしよう。
その前にデバッグの構成を行っておこう。[デバッグの開始]ボタンをクリックしたり、[F5]キーを押したりするたびに[環境の選択]を行うのは面倒だ。
Copyright© Digital Advantage Corp. All Rights Reserved.