Posted on April 23, 2019· Updated on July 3, 2022

PoetryとVSCodeを使ったPythonプロジェクト 第2部 - Pythonチートシート

#python #intermediate #vscode #packaging
Image for PoetryとVSCodeを使ったPythonプロジェクト 第2部 - Pythonチートシート
最初の記事では、pyproject.tomlファイルとは何か、それとの連携方法、Poetryを使用して新しいプロジェクトを開始する方法、仮想環境の作成方法、依存関係の追加と削除について学習しました。これらはすべて次のコマンドで行いました。
CommandDescription
poetry new [package-name]新しい Python プロジェクトを開始します。
poetry initpyproject.toml ファイルを対話形式で作成します。
poetry installpyproject.toml ファイル内のパッケージをインストールします。
poetry add [package-name]パッケージを仮想環境に追加します。
poetry add -D [package-name]開発パッケージを仮想環境に追加します。
poetry remove [package-name]パッケージを仮想環境から削除します。
poetry remove -D [package-name]開発パッケージを仮想環境から削除します。

この 2 番目のパートでは、次のことを行います。

  • 仮想環境をVSCodeに追加します。
  • 依存関係を更新します。
  • 開発依存関係をエディタと統合します。
    • Flake8
    • Black
    • Pytest

そして、3 番目の記事では、サンプルライブラリを作成し、Poetryでプロジェクトをビルドし、PyPIに公開します。

始める前に、VSCodeがインストールされており、Python拡張機能が追加されており、このシリーズの最初の記事をフォローし、理解していることを確認してください。

VSCode での Poetry の設定

最初のパートから数日経過しているため、依存関係の新しいバージョンを確認すると良いでしょう。ターミナルを開き、プロジェクトディレクトリに移動して、poetry updateコマンドを入力します。

poetry update

現時点では、新しいバージョンは利用できません。

venvコマンドで仮想環境を作成すると、VSCodeは自動的にそれをそのプロジェクトのデフォルトの Python 環境として設定します。Poetryを使用する場合、初回はプロジェクトフォルダー内でターミナルに次のように入力する必要があります。

poetry shell
code .

最初のコマンドであるpoetry shellは仮想環境内に私たちを起動し、code .は現在のフォルダーをVSCode内で開きます。

vscode

左側のパネルを使用してhow-longフォルダー(またはプロジェクト名が付いたフォルダー)を開き、__init__.pyの隣にhow-long.pyファイルを作成します。左下隅に、現在の Python 環境が表示されます。

python version

それをクリックすると、利用可能な環境のリストが表示されます。プロジェクト名が含まれているものを選択します。

choose python

次に、開発依存関係であるFlake8Black、およびPytestを Visual Studio Code に統合しましょう。

Flake8

Flake8は、プロジェクトにリンティング機能を提供します。つまり、構文エラーやスタイルエラーを警告し、VSCode のおかげで、入力しながらそれらを知ることができます。

デフォルトでは、Python 拡張機能にはPylintが有効になっていますが、これは強力ですが設定が複雑です。Flake8に切り替えるには、任意の Python ファイルを変更して保存すると、右下隅にポップアップメッセージが表示されます。

flake8

Select Linterをクリックし、リストからFlake8を選択します。これで、VSCodeは、深刻度に応じて緑または赤で、常に何が間違っているかのわかりやすい説明とともに、構文スタイルの問題を教えてくれます。

linting

2 つの問題があるようです。ファイル末尾の空行が不足している(スタイル)ことと、*Hello, World!*文字列の引用符の追加を忘れたこと(構文)です。これらを修正すると、すべての警告が消えるのを確認できます。

Black

Blackはコードフォーマッタであり、コードを確認し、PEP 8スタイルガイドに準拠するように自動的にフォーマットするツールです。これは、Flake8がスタイルのエラーをリンティングするために使用するのと同じPEPです。

shift + cmd/ctrl + pを押してコマンドパレットを開き、Format Documentと入力して Enter キーを押します。新しいポップアップメッセージが表示されます。

black formatter popup

Use Blackを選択します。次に、この不体裁なコードを Python ファイルにコピーします。

for i in range(5):         # this comment has too many spaces
      print(i)  # this line has 6 space indentation.

なんて醜い s***…コードでしょう。もう一度フォーマットを試して、Blackがすべてを修正する方法を確認してください!

もう 1 つできることは、保存するたびにBlackがコードを自動的にフォーマットするように VSCode を設定することです。cmd/ctrl + ,を押して設定を開きます。Workspace Settingsになっていることを確認し、Format On Saveを検索してチェックボックスをオンにします。

format on save

最後に、Blackはデフォルトで 1 行あたり 88 文字ですが、Flake8が許可する 80 文字とは異なるため、競合を避けるために、.vscodeフォルダーを開き、settings.jsonファイルの末尾に次を追加します。

{
    ...
    "python.linting.flake8Args": [
        "--max-line-length=88"
    ],
}

black-settings

Pytest

プログラミングに真剣に取り組んでいるなら、プロジェクトのテスト方法を学ぶことは非常に重要です。これは、出荷後に壊滅的なバグが出現する可能性を減らすことで、自信を持ってプログラムを作成し提供できるようにする、信じられないほど役立つスキルです。

Pytestは、テストの記述に非常に人気があり、ユーザーフレンドリーなフレームワークです。私たちはすでにインストールしています。そのため、VSCodeとの統合も行います。

testsフォルダーを開き、test_how_long.pyファイルを選択します。Poetryはすでに最初のテストを提供してくれています。

# test_how_long.py
from how_long import __version__

def test_version():
    assert __version__ == '0.1.0'

このテストでは、how_longフォルダー内にある__init__.pyファイルから__version__変数をインポートし、現在のバージョンが0.1.0であることをアサートします。統合ターミナルをTerminal > New Terminalで開き、次のように入力します。

pytest

出力は次のようになります。

pytest

OK、すべて順調です。shift + cmd/ctrl + pでコマンドパレットを開きます。

  • unitと入力し、Python: Configure Unit Testsを選択します。
  • pytestを選択します。
  • テストを保存したディレクトリ(この場合はtests)を選択します。

3 つのことが起こりました。

  • ステータスバーに新しいボタンRun Testsが表示されます。これは、ターミナルでpytestと入力するのと同じです。それを押して、Run All Unit Testsを選択します。完了すると、合格したテストの数と不合格だったテストの数が通知されます。

    test status bar

  • 左側のバーに新しいアイコンが表示されます。それをクリックすると、すべてのテストが表示されるパネルが表示されます。ここで、それぞれを個別に実行できます。

    test side panel

  • テストファイル内で、すべてのテスト関数の前に新しいオプションが表示されます。問題がなければチェックアイコンが、そうでなければxが表示されます。これにより、特定のテストを実行することもできます。

    test inline

結論

これまでに、次のことを行いました。

最後に、3 番目にして最後の記事では、次のことを行います。

  • サンプルライブラリを作成します。
  • Poetryでプロジェクトをビルドします。
  • PyPIに公開します。