Pythonの開発環境を２年ぶりにアップデート【uv+ruffに移行】

## はじめに

Python ⇒ C/C++ ⇒ System Verilog を経て、約2年ぶりに Python へ戻ってきました。

ということで、自分の知識を更新するために Python の開発環境を2024年版にアップデートします🎉

:::note info
**結論**
`Poetry` から `uv` に移行、`Flake8`, `Black`, `isort` を `ruff` に一本化しました。
:::

### 新しい開発環境（2024年～）

エディタは、[VSCode](https://code.visualstudio.com/)を使用する。
パッケージマネージャーは、 [**uv**](https://docs.astral.sh/uv/) を使用する。

開発用のツールとしては以下を使用する。

- [**ruff**](https://docs.astral.sh/ruff/)：リンター
- [**mypy**](https://www.mypy-lang.org/)：型ヒントを利用した静的型チェックツール
- [**pytest**](https://docs.pytest.org/en/stable/)：テストフレームワーク
- [**Sphinx**](https://www.sphinx-doc.org/ja/master/)：ReStructuredText を使用したドキュメント生成ツール

### これまでの開発環境（2022年）

エディタは、[VSCode](https://code.visualstudio.com/)を使用していました。
パッケージマネージャーは、 [**Poetry**](https://python-poetry.org/) を使用していました。

開発用のツールとしては以下を使用していました。

- [**Flake8**](https://flake8.pycqa.org/en/latest/)：`PyFlakes`, `pycodestyle`, `McCabe`などのラッパー
- [**Black**](https://black.readthedocs.io/en/stable/)：すべてが決まっているフォーマッター
- [**isort**](https://pycqa.github.io/isort/)：import 文を自動的に整理・最適化するツール
- [**mypy**](https://www.mypy-lang.org/)：型ヒントを利用した静的型チェックツール
- [**pytest**](https://docs.pytest.org/en/stable/)：テストフレームワーク
- [**Sphinx**](https://www.sphinx-doc.org/ja/master/)：ReStructuredText を使用したドキュメント生成ツール

## エディタ

https://www.cursor.com/

と思いきや、

https://code.visualstudio.com/

お金がないので、コーディングにAIを雇うことはまだできないです。
~~[Perplexity](https://www.perplexity.ai/) と [DeepL](https://www.deepl.com/ja/translator) だけで家計の予算をオーバー中。~~

:::note info
拡張機能の豊富さとデファクトスタンダードであることから、最適な選択と判断しました。
:::

## VSCodeの拡張機能



## パッケージマネージャ

https://docs.astral.sh/uv/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665667/6054c285-9be3-da09-0c49-1d574b29be7d.png)

### uvの主な特徴

- 🚀 `pip`, `poetry`, `pipx` などを単一ツールで置き換え
- ⚡️ `pip` と比較して 10～100 倍高速
- 🐍 Python のバージョン管理も可能
- 🛠️ プロジェクト管理機能が充実

### インストール方法

基本的に[devcontainer](https://code.visualstudio.com/docs/devcontainers/containers)を使用するため、以下のDockerfileで環境を用意しています。

```Dockerfile:Dockerfile
FROM python:3.12-slim-bookworm
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
```

:::note info
執筆時点(2024/11/13)では最新リリースが `0.5.1` なので、時期尚早かと思いましたが、使用してみて問題はなかったので採用です！

`Poetry` から `uv` に移行した理由は以下です。
- [PEP 621](https://peps.python.org/pep-0621/) に準拠しているから
- 高速に動作するから
- 同じ Astral 社製の `ruff` を使用するため
:::

## 開発支援ツール

https://docs.astral.sh/ruff/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665667/9aa7ff85-28fc-adfe-4e4a-a0d4876f30bc.png)

### ruffの主な特徴

- ⚡️ 既存のリンターやフォーマッターより 10～100 倍高速
- 🛠️ pyproject.tomlをサポート
- 🔧 800以上の組み込みルール
- 📦 キャッシュ機能

### インストール方法

開発環境にのみインストールするので、`--dev`オプションをつけます。

```shell
uv add --dev ruff
```

:::note info
`Flake8`, `Black`, `isort` を `ruff` に一本化したした理由は以下です。
- 依存パッケージが減らせるから
- 既存のリンター、フォーマッターと比較して圧倒的に高速だから
- 800以上の組み込みルールがあり、かなり網羅しているから
- 主要なリンターをほぼ含んでいるから

<https://docs.astral.sh/ruff/faq/> にFAQがあるので興味がある方はご一読ください。
:::

## その他（継続採用）

- [**mypy**](https://www.mypy-lang.org/)：型ヒントを利用した静的型チェックツール
- [**pytest**](https://docs.pytest.org/en/stable/)：テストフレームワーク
- [**Sphinx**](https://www.sphinx-doc.org/ja/master/)：ReStructuredText を使用したドキュメント生成ツール

:::note warn
Python のドキュメント生成ツールとして [**Sphinx**](https://www.sphinx-doc.org/ja/master/) は確固たる地位を築いていますが、[**MkDocs**](https://www.mkdocs.org/) も選択肢として検討中です。reStructuredText が苦手で Markdown で全部やりたい人は、すでに `MkDocs` を採用しているでしょう。
`MkDocs` のプラグインの充実度次第で移行したいなぁと思っています。
:::

## おわりに

2年見ないうちに `ruff`, `uv` なるものが出てきていて驚きました。~~浦島太郎状態~~
進化が速くていいですね！