はじめに
インストールすればすぐに書けて動かせるのが魅力のPythonですが、
実際に業務などでキチンと書こうと思ったら
- Pythonのバージョン管理ツール
- パッケージマネージャー
- エディター(IDE)
- リンター
- フォーマッター
- 型チェッカー
くらいは最低限用意する必要があります。
しかしこの界隈、怒涛の勢いで日々新しいものがリリースされていて一概に「これがベストプラクティス」を提示するのが難しいんですよね。そこで今回は上記それぞれのツールについて「こんなものがあるよ」というのをご紹介したいと思います。
TLDR
- バージョン/パッケージ管理はpyenv + Pipenvがスタンダードだった時代は終わった
- VS CodeかVimを使うなら型解析にPyrightを導入するとよい
- テンプレートを用意しました
1. バージョン/パッケージマネージャー
プロジェクトごとに異なるPythonのバージョンおよびパッケージを使い分けるためのツールです。
長らくpyenv + Pipenvが新時代のスタンダードと言われてきましたが、今はまた群雄割拠の時代に戻ってしまいました。
- pyenv + Pipenv
- pyenv + Poetry
- pyenv + DepHell
- pythonloc
- Pyflow
- など…
日本語のドキュメントが充実しているのは上2つでしょうか。個人的にはpyenv + Poetryが好きです。
詳しくは↓の記事が素晴らしいのでこちらをお読みください。
2020 年の Python パッケージ管理ベストプラクティス
なおPython3.8ではPEP 582という「仮想環境もうやめない?」的な提案があり、
これが正式に取り込まれるとこの辺りの管理はもっと楽になると予想されます。
Windows(NTカーネル)に光を。
2. エディター(IDE)
コードを書くための便利機能がいっぱい付いたメモ帳です。
選択肢は書ききれないので割愛します。
特にこだわりがなければVS Codeをおすすめしますが
- コード補完が効く
- デバッグできる
- リンター/フォーマッター/型チェッカーが動く
の3つを満たしていればどのエディタを使ってもいいと思います。
逆に言うとこれらを満たしていないエディタ(×××とか○○とか)を業務で使用するのはやめましょう。
3. リンター
書いたコードがコーディングルールに反していないか確認するためのツールです。
これはflake8を自分の使うフォーマッターに合わせてカスタマイズするの一択だと思うので
他に良いものをご存じの方は教えてください。
なおflake8はつい1月ほど前まで依存パッケージの問題でpycodestyleをGitHubからアップデートしないと
セイウチ演算子でエラーが出ていたのですが、今確認したら解決していました。
4. フォーマッター
書いたコードをコーディングルール通りに自動整形するツールです。
昔はautopep8使っとけみたいな風潮だったような気がするのですが、今は
- autopep8
- yapf
- black
と3つの選択肢があります。それぞれの特色については以下の記事に詳しいです。
私はとある宗教上の理由によりblackのフォーマットが受け入れられなかったためyapfを使っています。
5. 型チェッカー
Pythonを静的型付け言語っぽく書くためのツールです。
選択肢は
の3つでしょうか。pytypeは使いどころが分かりません…
Pyrightはmypyよりもチェックが速く(MS曰く5倍)、大規模なプロジェクトでもストレスなく型チェックが行えます。
正直これだけでVS Codeを使う理由になるくらい良いです。
mypyはVim、Emacs、Sublime Text、Atom、PyCharm、VS Codeと連携が取れます。
PyreもPyrightと同じくmypyより高速に動くことを売りにした型チェッカーですが、
使い方が他とは違う(ファイルの変更をサーバーに通知する)のでしっかり公式ドキュメントを読みましょう。
おわりに
というわけで各ツールについてのご紹介でした。
私は現在
- pyenv + Poetry
- VS Code
- flake8
- yapf
- Pyright
の構成で、Poetryの設定をvirtualenvs.in-project = true
にして開発を行っています。
テンプレートリポジトリを用意したので、プロジェクト内に置くべき設定ファイルの書き方など参考にしていただけたらと思います。
あと加えて上記のblackでも使われているGit Hooksの管理ツールpre-commitもチーム開発では必須級なので
こちら↓の記事も併せてどうぞ。
Git HooksはPython(など)で書いてPythonで管理しよう