🐍

Ruff: Flake8に代わる静的解析ツール

2023/06/10に公開

最近話題になっている(?)Ruffについて、備忘録用に簡単にまとめてみました。

そもそも静的解析ツールとは

静的解析とは実行せずにコード検証をおこなうことで、コーディング規約(PEP8)に従っているかなどをチェックしてくれます。ちなみに、静的解析ツールはLinterとも呼ばれます。
Pythonの静的解析ツールとして有名なのが、flake8です。

flake8とは

上記の通り、Pythonの静的解析ツールです。pipで簡単にインストール可能です。
筆者の場合は、VSCodeのsettings.jsonに以下を追加し、flake8の設定をしています。

{  
  ...,
  // linter (flake8)
  "python.linting.enabled": true,
  "python.linting.lintOnSave": true,
  "python.linting.pylintEnabled": false,
  "python.linting.flake8Enabled": true,
  "python.linting.flake8Args": [
    "--max-line-length=120",
    "--ignore=E203,W503,W504",
  ],
  // formatter (black)
  "python.formatting.provider": "black",
  "python.formatting.blackArgs": [
    "--line-length=120",
  ],
  ...
}

flake8はPythonの自動整形ツールであるblackと併用することが一般的です。

Ruffとは

さて、やっと本題のRuffについてです。Ruffは簡単にいうと、Pythonの静的解析ツールで、Rust製で非常に高速なのが特徴です。
個人的に大きな利点だと感じたのは、pyproject.tomlで設定可能な点です。flake8はpyproject.tomlに対応していないため、別途wrapper(pyproject-flake8)の導入が必要でした。

使い方

基本的には、ruff check .を実行するだけです。(.の部分は特定のディレクトリやファイルのパスでもok)
例えば、以下のようなコードがあった場合、次のようなエラーが発生します。

import os

def sample() -> str:
  return "これはsampleです."
❯ ruff .               
src/sample.py:1:8: F401 [*] `os` imported but unused
Found 1 error.
[*] 1 potentially fixable with the --fix option.

ただし、筆者の場合、コマンドを使用するのはCI実行時くらいです。基本的にはVSCode拡張機能であるPylanceで、エラー部分をチェックしています。

pyproject.toml

基本的にはデフォルトの設定のまま使用しています。行の長さだけ120を指定しています。

[tool.ruff]
line-length = 120

settings.json (VSCode)

筆者の場合、flake8の設定を消し、ruffの設定は特に追加していません。

おわりに

Pythonの静的解析ツールであるRuffについてまとめてみました。
今回は備忘録用なため、細かい説明や使い方を省いているのでご容赦ください。

Discussion