コンテンツにスキップ

Pythonのモダンな開発ツール#

2024 iThome鉄人レース

これはDjango Ninjaチュートリアルシリーズの第5回です。

現代のソフトウェア開発において、ツールは開発効率を向上させるだけでなく、コードの品質を改善し、プロジェクトの管理と保守をより簡単にしてくれます。

この記事では、いくつかの重要なPython開発ツールを紹介し、プロジェクトにおけるそれらの応用について議論することで、読者がそれらの位置づけと価値を素早く理解できるようにします。

もし私のブログをご覧になったことがあれば、私がこれらのモダンな開発ツールを強力に推進し、詳細なチュートリアル記事を次々と執筆してきたことにお気づきかもしれません。

そのため、これらのツールの操作の詳細には深入りせず、概念と、それらが開発における痛みをどのように解決するのかに焦点を当てます。興味のある読者がさらに学べるように、関連するチュートリアル記事のリンクを添付します。

特筆すべきは、これらのPythonのモダンな開発のベストプラクティスはすべて、私が開発者であるWei Lee(李唯)氏の「Python Table Manners」シリーズを読んでから、一つ一つ学び実践したものであるということです。個人的にこのシリーズを強くお勧めします!

GitHubサンプルプロジェクト#

👉 Django-Ninja-Tutorial


本プロジェクトではPython 3.12.5、Django 4.2 LTS、およびDjango Ninja 1.3.0を使用していますが、この部分については知っておくだけで構いません。

ここからは各ツールの紹介に入ります。

pyenv:Pythonバージョン管理#

pyenv(そうです、pは小文字です。pytestと同じです)は、複数のPythonバージョンを管理する強力なツールです。これにより、異なるプロジェクトで異なるバージョンのPythonを使用しても、競合を引き起こすことはありません。

プロジェクトに.python-versionファイルがあるのもこのためです——これはpyenvに対して、プロジェクトが使用するPythonのバージョンを宣言するものです。

pyenvは、異なるPythonバージョンを使用する複数のプロジェクトを扱う際に特に役立ちます。一部のプロジェクトで古いバージョンのPythonが必要な場合はなおさらです。

pyenvを通じて、Pythonのバージョンを簡単にインストールおよび切り替えられ、各プロジェクトが正しい環境で動作することを保証できます。

pyenvの詳細なチュートリアルについては、私が以前書いた記事を参考にしてください:


Poetry:仮想環境とパッケージ管理#

Poetryは現在非常に人気のあるPythonパッケージ管理ツールです。パッケージ管理——特にパッケージ間の「依存関係」の問題は、常にPython開発における大きな悩みでした。

Poetryが主に解決するのは、パッケージ間での依存先パッケージの異なるバージョン範囲に対する競合問題です。

これらの詳細は一言では言い尽くせないため、私の記事〈Pythonパッケージマネージャ——Poetry完全入門ガイド〉、特にその中の「用語解説」の部分を参考にしてください。

さらに、Poetryは仮想環境の管理も関わるため、pyenvとどのように併用し、仮想環境で正しいPythonバージョンを選択させるかというのもよくある問題です。これについては〈Poetry + pyenvチュートリアル:よく使うコマンドと注意事項〉の記事の紹介をご覧ください。


Ruff:LinterとFormatter#

時代は変わりました。以前はFlake8 + isort + Blackを使っていましたが——今はすべてRuffを使っています。

Ruffは、Rustで書かれた超高速なPython linterおよびformatterで、コードのフォーマットやスタイルの問題を素早くチェックし修正するために使用されます。

速い、とにかく速い

Ruffは、開発者が統一されたコードスタイルを維持する(主にPEP8に準拠する)のを助けます。その高いパフォーマンスにより、Ruffは特に大規模なプロジェクトに適しています。

さらに、Ruffは多くのFlake8プラグインの機能を統合したオールインワンのソリューションです。私にとって、これは速度に並ぶ大きな魅力です。

Ruffのさらに詳しい紹介については、私の記事を参考にしてください:


pre-commit:Git Hooks管理ツール#

よく言われるように、「CIがないなら、せめてpre-commitだけでも持て」——これは私が言った言葉です。

pre-commit(そうです、pは小文字です)はPython製のGit Hooks管理ツールで、さまざまなプログラミング言語のプロジェクトで利用できます。要件に合わせてGit Hooksを設定できます。

一般的な「pre-commit hook」を例にすると、git commitの実行時に、設定済みの各種チェックやフォーマッターを自動的に実行し、コミット対象のコードがルールに準拠しているか確認します。

これはコードの品質を維持するだけでなく、コードレビューにおける些細な問題を減らし、レビュアーがロジックやアーキテクチャの審査に集中できるようにします。

私たちのサンプルプロジェクトでは、pre-commitはRuffといくつかの基本的なフォーマットチェックを実行するように設定されており、コードスタイルの一貫性を確保しています。

関連記事:Python開発:pre-commitによるGit Hooks設定チュートリアル


Mypy:静的型チェック#

Pythonプロジェクトで型ヒントを使っていますか?

シリーズの第1回で述べたように、Django Ninjaは型ヒントを学ぶための非常に良いスタートとなります。

プロジェクトに型ヒントを追加したい場合、静的型チェッカー(static type checker)は不可欠です。そして、その中で最も一般的な選択肢がMypyです。

Mypyは強力なツールで、型エラーをチェックするだけでなく、プログラムを実行する前に多くの潜在的な問題を捕捉してくれます。私が見るに、それが実際に及ぼす影響は型の範囲を超えています

Mypyは大規模なプロジェクトやチームでの協力に必須のツールです。しかし私が強調したいのは、小規模なプロジェクトであっても、Mypyは明らかなメリットをもたらすということです。

Type hintsのコストとメリットは、以下の図(『Robust Python』から再描画)で説明できます。

長期的には、型ヒントとMypyを使用することで継続的なメリットがもたらされます——実はこれは本記事で紹介したすべてのツールに当てはまります😎。初期には学習と適応に時間を投資する必要がありますが、それだけの価値はあります

MypyとPython型ヒントのさらに詳しい紹介については、私の「Mypy三部作」シリーズをご覧ください:

  1. 《Robust Python》ノート:型ヒントを効果的に導入する方法
  2. Python type checker:Mypyの紹介
  3. DjangoプロジェクトにMypyを導入するガイド

結び#

pyenvはPythonのバージョンを柔軟に管理するのを助け、Poetryはパッケージの管理問題を解決し、Ruff、pre-commit、Mypyなどのツールはコードのクリーンさと一貫性を保証します。これらのツールは互いに補完し合い、高効率な開発環境を共同で構築します

これらを上手く活用することは、現代の開発者としての必須の素養であり、チームでの協力の重要な礎でもあります。学習にはいくらかの時間のコストがかかりますが、慣れてしまえば、これらのツールは開発プロセスにおいて不可欠な助けとなると信じています。