Pythonのリンターは何を選べばいいのか?

Pythonのリンターは何を選べばいいのか? プログラミング
Pythonのリンターは何を選べばいいのか?

はじめに

Pythonを書き始めてしばらくすると、「リンター入れた方がいいよ」と言われることがあります。
最初は正直、「ちゃんと動けばいいのでは?」と思っていました。

ですが、コード量が少し増えたあたりから、

  • なんか読みにくい
  • 微妙なミスに気づかない
  • 書き方が毎回ブレる

といった問題が目立つようになりました。そこでリンターを入れてみたところ、想像以上に助けられたので整理してみます。

リンターの役割

リンターとは何か

リンター(linter)は、コードを実行せずに「静的解析」して問題点を指摘してくれるツールです。

具体的には、

  • 文法エラー
  • 未使用の変数
  • 不適切なインポート
  • スタイル違反

などを検出します。

コンパイルエラーのような致命的なものだけでなく、「将来的にバグになりそうな書き方」も教えてくれます。

実際に使ってみて感じたこと

自分では問題ないと思っていたコードでも、

  • importしたのに使っていない
  • 変数名が上書きされている
  • インデントの揺れ

などが山ほど出てきました。

人間が書いてるとなかなか気が付けないことでも、一瞬で示唆してくれるのですぐに直すべきところがわかります。

Pythonではどういうリンターがあるのか

代表的なリンター

Pythonにはいくつかの有名なリンターがあります。

  • flake8
  • pylint
  • pyflakes
  • mypy(型チェック寄り)
  • ruff(最近の流行)

それぞれ思想や厳しさが違います。ルールが強い、弱いなど特徴があるようなので、人によっては合う合わないがあるとのこと。

昔からよく使われているのがflake8やpylintです。

pylintはかなり細かくチェックします。スコアまで出るので、最初は少し心が折れます。

flake8は比較的軽量で、必要最低限のチェックという印象でした。一時期はかなり人気だったようです。

最近の流行り・よく使われているリンター

ruffとは

最近よく名前を聞くのがruffです。
Rust製の高速リンターで、flake8系のルールをまとめて実装しています。

特徴としては、

  • とにかく高速
  • 多くのルールを内包
  • formatter機能も持つ

という点があります。

実際にruffを導入してみた

インストールは簡単で、

pip install ruff

その後、

ruff check .

とするだけでチェックできます。

VSCodeなどのIDEなら拡張機能での導入もできると思います。

速度が非常に速く、長めのコードでも一瞬で結果が出ました。ルールもflake8に慣れてる人なら違和感がないと思います。

自分はflake8をずっと使ってきたわけではありませんが、指摘事項が厳しいとは思いませんでした。

体感的には、「とりあえずruff入れておけばいいのでは」という空気があるのも納得です。

リンターを導入することで防げるミス

未使用コードの放置

importしたまま使っていないコードは意外と残ります。

リンターが即座に指摘してくれるので、とにかく使っていないものは消すという習慣が付きます。

危険な書き方の検出

  • 変数の上書き
  • 到達不能コード
  • 曖昧な比較

など、自分では見逃しがちなポイントを拾ってくれます。大きなバグに繋がりかねない部分なので、この辺はPython勉強中の自分としてはかなり助かります。

実際、バグ修正の時間が減りました。

構文の習熟

ミスとは少し違いますが、私のような独学の初学者にとっては、構文上のルールなどをリンターから学ぶことが多いです。

もちろんAIなどをメンターにすることもできますが、より粒度の低い「書き方」の部分での習熟が進みます。

プロジェクトのレギュレーションに合わせる必要

ルールは絶対ではない

リンターは万能ではありません。

プロジェクトごとに

  • どのルールを有効にするか
  • どの警告を無視するか

を調整する必要があります。特にチームなどで開発を行うときは、チーム内でルールをしっかり共有することが大事だと言われれます。

例えば、ruffでは設定ファイル(pyproject.toml)で細かく制御できます。

チームでは合意が重要

個人開発では好きに決められますが、チームでは「どのリンターを使うか」「どこまで厳しくするか」を揃える必要があります。

Aさんは○○、Bさんは××のリンターを使うといったことは基本的にやらない方がよいとされます。

ここがブレると、レビューで毎回スタイル論争になります。

まとめ

最初は「リンターは面倒なだけでは?」と思っていました。

ですが、

  • 小さなミスの早期発見
  • 書き方の統一
  • バグの予防

という意味で、導入の価値はかなり高いと感じました。

今から始めるなら、まずはruffを入れておけば十分だと思います。

その上で、必要に応じてmypyなど型チェックを追加したりすると、よりコードを書きやすくなると思います。

リンターは地味ですが、コード品質の土台になります。Pythonを本格的に触るなら、早めに入れておくのがおすすめです。

コメント

タイトルとURLをコピーしました