VS Codeの拡張機能でPythonの仮想環境構築からコード整形、Lintまでを体験してみよう:Visual Studio Codeで快適Pythonライフ(2/2 ページ)
簡単な関数を作りながら、VS CodeとPython拡張機能と各種モジュールを使って、仮想環境の構築、コード記述と整形、Lintによる問題点の発見までを見てみましょう。
コード整形
実は上に示したコードの細かいことはどうでもよくって(詳しい説明はしません)、ここではタブ幅が2になっていることや、引数に指定している値が「n - 2」「n-1」のように数値と演算子の間に半角空白文字があったりなかったりしているところに注目してください。
Pythonには、PEP 8などのコーディングスタイルガイドがあり、それに準拠するようにプログラムコードを成形してくれるツール(フォーマッタ)も存在しています。VS CodeのPython拡張機能ではautopep8/YAPF/Blackがサポートされています。ここでは、そのうちの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]コマンドを実行
これにより、ワークスペース設定に以下の2行が追加されます(実際にはこれらはユーザー設定でもデフォルトでtrueとなっているのですが、筆者が試したところではPyLintのインストールとコードの解析には、ワークスペース設定でこれらを明示的に設定する必要がありました)。
[
// 省略
"python.linting.pylintEnabled": true,
"python.linting.enabled": true
]
この状態でファイルを保存すると、次のようにPyLintのインストールを促すダイアログが表示されるので、ここでは[Yes]ボタンをクリックします。
このダイアログが出ないときには、ターミナルから「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]
以上の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のデバッグについて見ていく予定です。
Copyright© Digital Advantage Corp. All Rights Reserved.