Blog

個人的Python開発環境構築

はじめに

こんにちは、ニフティ株式会社 基幹システムグループの小倉です。今回は、業務で扱うことの多いPython開発環境に対して、個人的に快適でモダンな開発環境を考えてみたので、共有しようと思います。

使用するツールについて

Visual Studio Code今回使用するエディタになります。
Dockerコンテナ技術を提供するツールです。
PoetryPoetryはPythonパッケージマネージャの1つです。普段の開発ではpipenvを用いることが多いですが、Poetryでは依存解決を高速に行える点と他のパッケージの設定ファイルをまとめて管理できるメリットがあるため今回は使用してみました。
RuffRuffは、Rustで記述されたPython用Linterです。Rustを使用しているだけあって処理速度は既存のLinterライブラリの中で最速です。また、スター数も伸びていて、AWS SAMやFastAPI等の有名なオープンソースプロジェクトでも使用されています。
BlackBlackはPEP8に準拠したFormatterライブラリです。autopep8やyapfなどの他のFormatterより制限が厳しく、個人で自由に設定できる項目が少ないです。このため、フォーマットに関して、チーム内でルールを決める時間を省けます。
MypyMypyはPythonの静的型チェックを実行するライブラリです。mypyを用いることで、型ヒント不足や型の矛盾の検知が可能になり、コードの可読性向上や堅牢性向上に繋がります。
PytestPythonの単体テストでよく使われているライブラリです。
PoethepoetPoetryと相性の良いタスクランナーです。PoetryにはPipenvのScriptのようなタスクランナー機能がないので、Poethepoetを使って実現しています。

事前準備

  • Visual Studio Code(以下VSCode)、Dockerのインストール
  • VSCode拡張機能のDev Containersのインストール

環境構築

開発環境としては、Dockerを用いたPythonコンテナ環境を構築し、VSCode拡張機能のDev ContainerのRemote先に今回のコンテナ環境を指定します。このように、Dev Containerを経由することで、コンテナ環境下でもローカル環境と同様にVSCodeの便利な拡張機能を使用した開発が可能になります。

作業ディレクトリ構成

作業ディレクトリは以下のようになっています。

Dockerfile

まず、ベースとなるPythonコンテナ環境を作成するため、以下のようにDockerfileを記述します。

compose.yaml

compose.yamlに関しては以下のように記述しています。

pyproject.toml

pyproject.tomlではpoetryによる開発環境用と本番環境用のライブラリの記述以外にも、今回使用するRuff、Black、Mypy、Pytest、Poethepoetの設定もまとめて管理します。

Poetry

環境ごとにライブラリの依存関係を分離するためにはtool.poetry.group.<group>を使用します。

Mypy

strict = trueにすることでmypyのオプションのエラーチェックフラグをすべて有効にし、厳重な型チェックが可能になります。ただし、いくつかのオプションはstrict モードでも無効になっています。無効になっているフラグに関しては、 mypy --help の出力で確認することができます。

Ruff

Ruffでは、現時点で500を超えるlint ルールをサポートしており、selectに追加したいルールに紐づくコード名を記述するで有効にすることができます。デフォルトでは Pyflakes(F) と pycodestyle (E)が有効になっています。

Black

基本的な設定としては、line-lengthによって1行の文字数制限を変更できます。

Pytest

testpathsでテストディレクトリの設定しています。
今回はついでにカバレッジを取得するPytest-covもInstallしています。

Poethepoet

基本的な使い方としては、今回のpyproject.tomlで定義しているように[tool.poe.tasks.<task_name>]で設定し、poe <task_name>で実行できます。 今回の例では、pytest -v --cov=. --cov-branchコマンドでpytestのテスト結果とカバレッジを毎回叩くのが面倒なので、poe pytestで実行できるようにしています。

devcontainer.json

  • devcontainerの設定にはdevcontainer.jsonを使用します。
  • 今回の用途ではまず、compose.yamlの場所、compose.yamlで定義するservice名とワークディレクトリを指定しています。
  • devcontainer環境で使用したいVScode拡張機能をextensions、その拡張機能の詳細設定をsettingsで定義します。
  • 今回は拡張機能として、Python拡張機能とruffの拡張機能を入れています。
  • 拡張機能の詳細設定としては、デフォルト設定の不要な機能無効化、それぞれのライブラリのインタープリタパスとpyproject.tomlで定義したライブラリの設定を拡張機能側に反映させています。

動作確認

以上の設定が完了したら、コマンドパレッド(command + option + P)を開き、Reopen in Containerを実行することで、以下の画像のようにdevcontainer環境に入れます。
Dev Container環境に入ると以下のような機能が利用できるようになっています。
  • それぞれのライブラリのルールに違反したコードに波線ハイライト
  • editor.formatOnSaveによってBlackによる保存の際に自動フォーマット
  • Pythonコード内で保存した際にruffによる自動修正
  • Pytestの機能として、画面左側のフラスコマークをクリックすることでテスト対象のディレクトリ、ファイル名、テスト名が表示されデバッグやテストがGUIから実行可能

おわりに

ここまで、Dev Containerを使ってPythonのDocker開発環境を構築しました。 今回は必要最低限の設定しかしていないので、このコードを参考に独自にカスタマイズしていただければ幸いです。

We are hiring!

ニフティでは、さまざまなプロダクトへ挑戦するエンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトよりお気軽にご連絡ください! Tech TalkやMeetUpも開催しております!
こちらもお気軽にご応募ください!