簡単な関数を作りながら、VS CodeとPython拡張機能と各種モジュールを使って、仮想環境の構築、コード記述と整形、Lintによる問題点の発見までを見てみましょう。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Visual Studio Code(以下、VS Code)のPython拡張機能については第1回でも軽く触れましたが、今回はこの拡張機能とVS Codeが標準で提供するプログラムコードの整形、Lint機能などについて見ていくことにしましょう。
VS CodeにPython拡張機能をインストールすると、実際には以下の3つの拡張機能がインストールされます。
Python拡張機能は、(Pylanceを利用した)IntelliSense、Lint、デバッグ、コードナビゲーション、コード整形、リファクタリングなどの機能を提供するものです。PylanceはVS CodeにPython拡張機能をインストールした際にデフォルトの言語サーバーとなり、IntelliSenseの使い勝手をより向上させています。Jupyter拡張機能は、その名の通り、VS CodeでJupyterを使うためのものですが、今回は触れません。
これらを使って、以下ではVS CodeでどんなふうにPythonのコードを記述したり、整形したり、問題点を発見したりしていくかを見ていきましょう。
ここでは、VS Codeから空のフォルダ(ワークスペース)を新規に作成してオープンし、そこに幾つかのPythonファイルを作成し、そこにコードを書いていきます。[エクスプローラー]ビューにある[フォルダーを開く]ボタンをクリックして、適当にフォルダを作成して、それをオープンしてください(ここでは「vscpy08_test」というフォルダ名にしました)。
フォルダをオープンすると、「このフォルダー内のファイルの作成者を信頼しますか?」というダイアログが表示されます。これはVS Code 1.57から正式に導入された機能で、フォルダ(ワークスペース)のブラウズやコードの編集を安全に行うためのものです。フォルダの作成者を信頼できるなら[はい、作成者を信頼します……]ボタンをクリックすることで、自由にそのフォルダの内容をブラウズしたり編集したり、実行したりできるようになります。一方、信頼できなければ、[いいえ、作成者を信頼しません……]ボタンをクリックすることで、制限を設けたモードでフォルダがオープンされます。
ここでは自分でフォルダを作成したので、[はい、作成者を信頼します……]ボタンをクリックしましょう(状況に応じて、その上にある[親フォルダー 'XXX' 内のすべてのファイルの作成者を信頼します]をチェックしても構いません)。
ここで、「mymath.py」という名前のファイルを作成してみましょう。
拡張子が「.py」のファイル(Pythonファイル)が作成された時点で、Python拡張機能が有効になり、VS CodeからそのフォルダにあるPythonファイルを実行するときに使われるPythonインタプリターが自動的に選択されます(上の画像でステータスバーの左下に表示されている「Python 3.9.5 64-bit」というのがそうです)。
自分の環境に複数のインタプリターをインストールしているときには、ステータスバー左下のPythonバージョンをクリックするか、コマンドパレットから[Python: インタープリターを選択](Python: Select Interpreter)コマンドを実行することで、使用するものを明示的に選択可能です。
どのPythonインタプリターを使用するかの設定は、ワークスペース設定のpython.pythonPath項目に記録されます。ただし、この設定項目はVS Code 1.57で非推奨となっています。これは、あるフォルダに含まれるソースコードをさまざまな環境でVS Codeを使って編集しようとしたときに、ワークスペースレベルで記録されているPythonのパス設定が、異なる環境や異なるOSで衝突してしまう可能性があるためでしょう(例えば、Windows版のVS Codeでオープンしていたフォルダを、環境を変えてmacOS版のVS Codeでオープンしたときに、python.pythonPath設定が役に立つでしょうか)。以下はWindows版のVS Codeの[編集]エディタでこの設定項目を表示したところですが、説明が「DEPRECATED」で始まっているところに注目してください。
上で見たのは単にPythonインタプリターを設定するだけでしたが、フォルダごとに環境構築をしたい、システムワイドなPythonからは独立して何らかのライブラリを外部からインストールしたいといった場合には、そうすることも可能です。これには幾つかの方法がありますが、ここではPythonに標準で付属するvenvモジュールを使って仮想環境を構築する方法を見てみましょう。
これを行うためにまずはコマンドパレットから[Python: Create Terminal]コマンドを実行します。これにより、(デフォルトの動作では)VS Codeのウィンドウのパネル領域にターミナルが開かれます。
ターミナルにフォーカスを移動して(これにはコマンドパレットの[ターミナル: ターミナル タブ ビューにフォーカス]コマンドや対応するショートカットを使うのが便利かもしれません)、「python3 -m venv .venv」「py -3 -m venv venv」などのコマンドを実行します。以下はWindows環境での例です。
これにより、仮想環境が構築されます。[エクスプローラー]ビューを見ると、VS Codeでオープンしたフォルダの下に仮想環境となるフォルダ(この例ではvenvフォルダ)が作成され、その下に各種のフォルダが作成されたことが分かります。
ただし、仮想環境を有効にするには、ステップがもう1つ必要です。ステータスバー左端のPythonバージョンをクリックするか、コマンドパレットから[Python: インタープリターを選択]コマンドを実行して、作成した仮想環境にあるPythonインタプリターを選択します。
作成した仮想環境にあるPythonインタプリターが見つからなければ、コマンドパレット右上の[Refresh Interpreter list]ボタンをクリックすると見つかるはずです。
その後、先ほど作成したターミナルを終了して、再度コマンドパレットから[Python: Create Terminal]コマンドを実行すると、仮想環境が有効になったターミナルが開かれます。ここからpipコマンドでライブラリをインストールしたり、REPLを起動したり、コマンドラインからPythonファイルを実行したりできます(WindowsでターミナルにPowerShellを指定している場合、デジタル署名がされていないことを理由として、うまくターミナルを開けないかもしれません。その場合には「Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process」を実行してください)。
ここで有効にしておくと便利な設定項目が1つあります。それはpython.terminal.activateEnvInCurrentTerminal項目です。
この設定をチェックして有効にした場合、VS Codeのパネル領域にターミナルを開いたまま、VS Codeを終了して、次に同じフォルダをオープンすると、Python拡張機能が読み込まれるときにそのターミナルで仮想環境が自動的に有効になるというものです。毎日のようにVS Codeで作業をしているのであれば、ほんの一手間ですが、仮想環境を有効にする手順が自動で行われるので覚えておくとよいでしょう。
以下では、この環境を使用して、いろいろと試してみることにしましょう。しかし、その前にコードの説明を少しだけしておきます。
ここではn番目のフィボナッチ数を求める関数を3つ定義しています。フィボナッチ数(Fibonacci number)とは、だいたい次のような性質を持つ数であり、それらが並んだものをフィボナッチ数列と呼びます。
つまり、第0項を0、第1項を1として、第2項は「第0項+第1項」=0+1=1、第3項は「第1項+第2項」=1+1=2、……という性質を持つ数のことです。フィボナッチ数列を先頭から幾つか列挙すると「0、1、1、2、3、5、8、13、21、34、55……」のようになります。
実際のコードは次の通りです。IntelliSenseによるコード補完や関数のパラメーター紹介(インレイヒント)については使えば分かるでしょうから、ここでは取り上げません。
def fib(n): # タブ幅2
if n == 0:
return 0
elif n == 1:
return 1
return fib(n - 2) + fib(n-1) # 引数が「n - 2」「n-1」
def fib_l(n):
a = 0
b = 1
if n == 0:
return a
elif n == 1:
return b
for num 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={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関数は上に示した定義をベタにプログラムコードにしたもので、fib_l関数はforループを用いてこれを計算し、fib_m関数は「メモ化」と呼ばれる技法(ここでは一度算出したフィボナッチ数を何度も計算しないで済むようにキャッシュしておくものと考えてください)を使ったものです。
では、このコードを使って、次ページではコードの整形を行い、このコードが抱える問題点を発見してみましょう。
Copyright© Digital Advantage Corp. All Rights Reserved.