検索
連載

VS Codeの拡張機能でPythonの仮想環境構築からコード整形、Lintまでを体験してみようVisual Studio Codeで快適Pythonライフ(2/2 ページ)

簡単な関数を作りながら、VS CodeとPython拡張機能と各種モジュールを使って、仮想環境の構築、コード記述と整形、Lintによる問題点の発見までを見てみましょう。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

コード整形

 実は上に示したコードの細かいことはどうでもよくって(詳しい説明はしません)、ここではタブ幅が2になっていることや、引数に指定している値が「n - 2」「n-1」のように数値と演算子の間に半角空白文字があったりなかったりしているところに注目してください。

 Pythonには、PEP 8などのコーディングスタイルガイドがあり、それに準拠するようにプログラムコードを成形してくれるツール(フォーマッタ)も存在しています。VS CodeのPython拡張機能ではautopep8YAPFBlackがサポートされています。ここでは、そのうちのYAPFを使用して、上記のコードを整形してみましょう(YAPFはGoogleがオープンソースとして開発しているフォーマッタで、デフォルトではPEP 8に準拠するようにコードを整形してくれるものです)。

 コードを整形するには、コマンドパレットから[ドキュメントのフォーマット](Format Document)コマンドを実行します(同名のコマンドが2つありますが、ここでは末尾に「...」がなく、ショートカットキーが設定されているものを選択しています)。

[ドキュメントのフォーマット]コマンド
[ドキュメントのフォーマット]コマンド

 すると、以下のように整形に使用するフォーマッタをインストールするかどうかを尋ねるダイアログが表示されます。

インストールを促すダイアログ
インストールを促すダイアログ

 このメッセージを見ると、「autopep8がインストールされていないので、インストールしますか?」となっています。選択肢は[Yes]か「Use black」か「Use yapf」となっています。ここでは[Use yapf]ボタンをクリックしましょう。これにより、YAPFのインストールが実行されます(ここでは、先ほど作成した仮想環境以下にインストールされます)。

インストールが完了したところ
インストールが完了したところ

 インストールが完了したら、もう一度[ドキュメントのフォーマット]コマンドを実行してください。これにより、コードが次のように修正されます。

整形後のコード
整形後のコード

 どうでしょうか。タブ幅が4に、引数が「n - 2」「n - 1」のように半角空白文字の入り方が統一されています。加えて、本連載では、あえて関数の後の空行を1行だけとしていましたが、これも2行になっています(PEP 8では関数定義の後には2行の空行を入れることが推奨されています)。

 いとも簡単にコードの整形が行えるので、これを起動するショートカットキー(Windows/Linuxでは[Shift]+[Alt]+[F]キー、macOSでは[Shift]+[Option]+[F]キー)はぜひ覚えておきたいところです。

 さらにテキストをコピー&ペーストしたときに、自動的に整形するかどうかや、ファイル保存時に自動的に整形するかどうかなどを設定することも可能です。お好みの項目を設定するとよいでしょう。

項目 説明 設定可能な値 デフォルト値
editor.formatOnPaste コードをペーストしたときに整形するかどうか true
false
false
editor.formatOnSave ファイルの保存時に整形するかどうか true
false
false
editor.formatOnSaveMode ファイル保存時に整形する際にファイル全体を整形するか、変更部分だけを整形するか "file"
"modifications"
"file"
editor.formatOnType コードを入力時に行単位で整形するかどうか true
false
false
自動整形に関連する設定項目

 なお、autopep8、YAPF、Blackの3つのフォーマッタを起動する際のオプションの指定なども可能です。

項目 説明 設定可能な値 デフォルト値
python.formatting.provider 使用するフォーマッタ "autopep8"
"yapf"
"black"
"none"
"autopep8"
python.formatting.autopep8Args autopep8に対するオプション オプションの内容を含む文字列リスト []
python.formatting.autopep8Path autopep8のパス パスの文字列表現 "autopep8"
python.formatting.blackArgs Blackに対するオプション オプションの内容を含む文字列リスト []
python.formatting.blackPath Blackのパス パスの文字列表現 "black"
python.formatting.yapfArgs YAPFに対するオプション オプションの内容を含む文字列リスト []
python.formatting.yapfPath yapfのパス パスの文字列表現 "yapf"
整形に関連する設定項目

 パスについては通常は変更する必要はないでしょう(モジュールをインストールしてあれば、デフォルトのままでよいと思われます)。オプションの記述の仕方についてはVS Codeのドキュメント「Formatting」および上記リンクから各フォーマッタのオプションを参照してください。

Lintの実行

 本稿の最後にLintについても簡単に触れておきましょう。Lintが行うのは一般にプログラムコードを解析して、問題があるところや、より読みやすいコードにできる箇所の検出です。Pythonにはこうした処理を行ってくれるLinterが多数あり、VS CodeのPython拡張機能でもPyLintなど多くのモジュールがサポートされています。以下ではVS CodeでデフォルトのLintツールとされているPyLintを例に、実際にどんな形で問題箇所や改善すべき箇所が報告されるかを見てみましょう。

 VS CodeではデフォルトのLintツールがPyLintになっていることは今も述べましたが、PyLintを使って、実際にコードを解析するにはPyLintモジュールのインストールが必要になります。

 簡単な方法は、コマンドパレットから[Python: Select Linter]コマンドを実行して、Linterとして[PyLint]を選択します。

コマンドパレットから[Python: Select Linter]コマンドを実行
コマンドパレットから[Python: Select Linter]コマンドを実行
Linterとして[pylint]を選択
Linterとして[pylint]を選択

コマンドパレットから[Python: Select Linter]コマンドを実行


 これにより、ワークスペース設定に以下の2行が追加されます(実際にはこれらはユーザー設定でもデフォルトでtrueとなっているのですが、筆者が試したところではPyLintのインストールとコードの解析には、ワークスペース設定でこれらを明示的に設定する必要がありました)。

[
    // 省略
    "python.linting.pylintEnabled": true,
    "python.linting.enabled": true
]


ワークスペース設定に追加された行

 この状態でファイルを保存すると、次のようにPyLintのインストールを促すダイアログが表示されるので、ここでは[Yes]ボタンをクリックします。

PyLintのインストールを促すダイアログ
PyLintのインストールを促すダイアログ

 このダイアログが出ないときには、ターミナルから「pip3 install pylint」コマンドなどを実行してください(環境によっては、インストールには管理者権限が必要になるかもしれません)。

 いずれの方法にしても、PyLintがインストールできたら、対象のファイルを保存するかコマンドパレットから[Python: Run Linting]コマンドを実行すると、次のようにコードの解析が行われて、以下のような報告がパネルの[問題]タブに表示されます(場合によっては、python.linting.pylintUseMinimalCheckers項目のチェックを外す必要があるかもしれません)。

コードの静的解析結果の報告
コードの静的解析結果の報告

 上の画像では、警告(三角形)が2つ、コーディングガイドに従っていないとしてヒント(丸囲みのビックリマーク)が11個表示されています。PyLintはメッセージを以下の5つに分類しています(余談ですが、Pylance拡張機能も変数numが使われていないことを報告してくれています)。

カテゴリ 説明 VS Codeでの表現
Convention プログラミング規約に違反している 緑色の下線
Refactor コードから怪しい雰囲気が漂っている 丸囲みのビックリマーク
Warning Pythonに固有の問題 警告(三角形)
Error バグと思われる エラー(×印)
Fatal PyLintの処理を中断させるエラー エラー(×印)
PyLintのメッセージの種類

 上の画像で丸囲みのビックリマークの部分を見ると、ほとんどが関数にdocstring(関数やパラメーターに関する説明を記述した文字列)がないか、変数名が短すぎることを原因として報告されています(ここではこれらについては無視します)。一方、三角形の警告は「未使用の変数名'num'」「引数のデフォルト値に辞書を使うのは危険」となっています。

 fib_l関数のforループに記述したループ変数のnumは確かに内部で使っていないので、これは使用しないことを意味する「_」にするのがよいでしょう。もう一つの危険なデフォルト値というのは、関数やメソッドのデフォルト引数値としてリストや辞書などを使用すると、それは関数やメソッドの定義時に作成されて、以後は対応する引数が渡されなかった場合に常にそれが使われることから問題が発生することを意味しています。

 例えば、次のコードを見てください。

def foo(value, value_list=[]):
    value_list.append(value)
    return value_list

print(foo(1))  # [1]
print(foo(2))  # [1, 2]

デフォルト引数値にリストを使うと……

 foo関数のvalue_listパラメーターのデフォルト引数値は空のリストのように思えます。しかし、実行してみると、最初の呼び出しでデフォルト引数値として作成された空のリストには「1」が追加されているために、2回目の呼び出しでは[1]というリストに要素が追加されています。これは思った通りの振る舞いとはいえないでしょう。そういう意味で、fib_m関数で以下のようにデフォルト引数値に辞書を使っているのは危険だと報告が上がったわけです。

def fib_m(n, memo={0: 0, 1: 1}):
  if n not in memo:
    memo[n] = fib_m(n - 2, memo) + fib_m(n-1, memo)
  return memo[n]

fib関数

 以上の2つの警告を修正するなら、例えば、次のようなコードが考えられます。

def fib_l(n):
    a = 0
    b = 1
    if n == 0:
        return a
    elif n == 1:
        return b
    for _ in range(n - 1):
        a, b = b, a + b  # (0, 1)→(1, 0+1)→(1, 1+1)→(2, 1+2)……のようになる
    return b

def fib_m(n, memo=None):
    if not memo:
        memo = {0: 0, 1: 1}
    if n not in memo:
        memo[n] = fib_m(n - 2, memo) + fib_m(n - 1, memo)
    return memo[n]

修正後のコード

 以上の修正を行って、ファイルを保存すると、警告がなくなるはずです。Lintにもさまざまな設定項目があるのですが、これらについてはVS Codeのドキュメント「Linting Python in Visual Studio Code」などを参照してください。


 今回は3つの関数を定義しながら、仮想環境の構築、Pythonインタプリターの選択、コード整形とLintの実行といった、VS CodeとPython拡張機能を使ってコードを記述する流れがどのようになるかを見ました。次回は今回に定義した関数を実行しながら、VS Codeのデバッグについて見ていく予定です。

「Visual Studio Codeで快適Pythonライフ」のインデックス

Visual Studio Codeで快適Pythonライフ

Copyright© Digital Advantage Corp. All Rights Reserved.

前のページへ |       
[an error occurred while processing this directive]
ページトップに戻る