Blogical

AWS/Salesforceを中心に様々な情報を配信していきます(/・ω・)/

VS Code で Python の開発環境を用意する【デバッグ編】

こんにちは、ロジカル・アーツの笹原です。

今回は、VS Code を使用した Python コードのデバッグ方法を紹介したいと思います。

はじめに

コードを書きはじめの頃は、デバッグする際に一時的に print 関数を追加して変数の中身などを確認していましたが、都度追加や削除する必要があり、手間がかかっていました。次第に面倒になってきたので、本腰を入れて VS Code でのデバッグ方法を調べました。最近はそれなりに使っていて、かなり便利だと思います。

以下の手順で扱う環境は次の通りです:

デバッグ

この記事ではブレークポイントを打ち、ステップ実行する方法を紹介します。

サンプルコードについて

デバッグコードのサンプルとして、以下を使用します。

def collatz(n):
    """与えられた数を初期値として Collatz 数列を計算する。

    Args:
        n (int): 初期値。

    Raises:
        NotPositiveNumberError: 初期値が0以下の場合に発生する。

    Returns:
        tuple: 数列の長さと最大値のタプル。
    """
    seq = [n]
    if n <= 0:
        raise NotPositiveNumberError

    while n > 1:
        if is_even(n):
            n //= 2
        else:
            n = 3 * n + 1
        seq.append(n)
    return len(seq), max(seq)


def is_even(n):
    """与えられた数が偶数かどうか判定する。

    Args:
        n (int): 整数。

    Returns:
        bool: 偶数であれば `True` を返す。
    """
    return n % 2 == 0


class NotPositiveNumberError(Exception):
    """正の整数でない例外クラス。"""

    pass


if __name__ == "__main__":
    n = input("数字を入力してください:")
    try:
        length, max_num = collatz(int(n, base=10))
        print(f"数列の長さ:{length}")
        print(f"数列の最大値:{max_num}")
    except (NotPositiveNumberError, ValueError):
        print("正の整数を入力してください。")

このサンプルコードでは Collatz 予想に出てくるアルゴリズムを実装してます。すなわち、与えられた正の整数に対して偶数であれば 2 で割り、奇数であれば 3 倍して 1 を足すという操作を繰り返し行います*1。 コード中の collatz 関数は入力が 1 に到達したときの数列の長さと、取り得る値の最大値を返します。

例えば、入力が 13 のとき Collatz 数列は

 \displaystyle 13\to40\to20\to10\to5\to16\to8\to4\to2\to1

となり、数列の長さは 10、最大値は 40 です。

デバッグ設定ファイルの作成

サイドバーのデバッグアイコンをクリックし、create a launch.json file の箇所をクリックします。

Python ファイルを選択します。

以下のような launch.json ファイルが作成されていると思います。

.vscode/launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: 現在のファイル",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "justMyCode": true
        }
    ]
}

これで準備が整いました。

実行

ブレークポイントを設置します。 デバッグ対象のファイルを開き、以下画像の青枠あたりでコードの実行を停止したい行をクリックします。

F5 キーまたは画面右上のデバッグアイコンをクリックするとデバッガが起動します。この状態で、ターミナルで -1 を入力してみます。

以下の画像のようにブレークポイントの箇所で処理が停止したと思います。 また、エディタ左側の「VARIABLES」の箇所に現在のローカル変数の中身が確認できると思います。入力した -1 がローカル変数 n に代入されていることが分かります。

F10 キーもしくは以下画像の赤枠で囲んだアイコン(Step Over)をクリックすると、処理が次の行に進みます。(以下の画像は 2 回押した後のものです。)

そのままステップ実行を繰り返すと、最終的に 正の整数を入力してください。 をターミナルに出力して処理が終了します。

他にも F5 キー(Continue)を押して次のブレークポイントに移動したり、F11 キー(Step Into)を押して関数やメソッド内部の処理についてもステップ実行したりできます。

便利機能

知っておくとさらにデバッグが捗る機能を二つ、簡単に紹介します。

ウォッチ式

ウォッチ式を使用すると、変数や式の結果を追跡できます。

例: 以下の画像のように 17 行目にブレークポイントを打ち、「+」アイコンをクリックします。入力欄が表示されるので変数名 n を入力します。

F5 キー等でデバッガを起動し、ターミナルで好きな数字(正の整数)を入力します。一度ブレークポイントで停止するので、そのあと F5 キーを何度か押してみて下さい。画像の赤枠の n の値が押すたびに変わっているのが分かると思います。

デバッグコンソールについて

デバッグコンソールを使用すると、デバッグ中に式を評価することができます。例えば、変数の値を書き換えたり、関数を呼び出すことができます。

例: ウォッチ式の例と同様、17 行目にブレークポイントを打ち、デバッガを起動します。ターミナルで好きな数字(正の整数)を入力し、ブレークポイントで停止したら Ctrl + Shift + Y を押し、デバッグコンソールパネルを開きます。

入力欄に n = 28 と入力して実行してみましょう*2。変数 n の値が書き換えられたことが分かります。

おわりに

ごく基本的なところは押さえたつもりですが、他にも条件付きブレークポイントなど、デバッグに関する様々な機能があります。私も全てを使いこなせているわけではないですが、ここに書かれていることができるだけでも開発効率は大きく向上するかと思います。

参考

*1:そして、 最終的にどんな数であっても 1 になるであろうというのが Collatz 予想です。

*2:この例では、最初の入力値を 77 としています。入力値が 28 の場合は別の値にしてください。