フォーマッター/リンターしたい(ruff)
$ ruff --version
ruff 0.6.1
$ ruff format
$ ruff check
$ ruff check --statistics
ruffはRustで書かれたPython用のリンター&フォーマッタです。
これまでblack、isort、flake8を組み合わせてできたことをすべてruffに集約できます。
pyproject.tomlに設定を記述できるため、既存のPythonプロジェクトにも導入しやすいです。
注釈
Pythonのリンター&フォーマッタの変遷は闇が深そうです。
時代とともにベストプラクティスが移り変わっている感じで、
これを使っておけばOKみたいな標準的なモジュールが存在しませんでした。
ruffは、そのような悩みを解決してくれるツールです。
インストールしたい(ruff)
// グローバルに追加
$ pipx install ruff
// プロジェクトに追加(dev)
$ poetry add ruff --group=dev
// プロジェクトに追加する場合(dev)
$ uv add ruff --group dev
// グローバルに追加
$ uv tool install ruff
ruffはCLIツールなのでpipxやuv toolなのでグローバルにインストールできます。
プロジェクトに追加する場合は --group dev オプションで追加するとよいです。
設定したい([tool.ruff])
1# pyproject.toml
2
3[tool.ruff]
4# 対象となるPythonのバージョン
5target-version = "py311"
6
7# 1行あたりの最大文字数
8# デフォルトは88。100くらいにしてもよい説がある
9line-length = 88
10
11# 未使用importの自動削除
12# fix = true
13
14# 並列実行数
15# threads = 4
16
17# ruff check の設定
18[tool.ruff.lint]
19# チェックするルールセット
20select = [
21 "E", # pycodestyle (PEP8)
22 "F", # pyflakes(未使用変数・未定義参照など)
23 "I", # import order(importの順序)
24 "B", # bugbear(潜在的なバグ)
25 "UP", # pyupgrade(新しい構文へ自動更新)
26 "N", # pep8-naming(命名規則)
27 "C4", # flake8-comprehensions(内包表記の改善)
28 "SIM", # flake8-simplify(冗長な構文の簡略化)
29 "RUF", # Ruff独自の拡張
30]
31
32# チェックしないルールセット
33ignore = [
34 "E501", # 行の長さ
35]
36
37# 自動修正するルールセット
38fixable = ["ALL"]
39unfixable = []
40
41
42# import orderの設定
43[tool.ruff.isort]
44combine-as-imports = true
45known-first-party = ["自作したパッケージ名"]
46
47# ruff formatの設定
48[tool.ruff.format]
49quote-style = "double" # ["double" | "single"]
50indent-style = "space" # ["space" | "tab"]
51line-ending = "lf" # ["lf", "crlf", "native"]
52skip-magic-trailing-comma = false # 末尾のカンマを残す(false) | 残さない(true)
53docstring-code-format = true # docstringも整形する(true) | 整形しない(false)
Ruffの設定はpyproject.tomlの[tool.ruff]セクションに記述できます。
また、ruff.tomll、.ruff.tomlに個別設定として保存することもできます。
フォーマットしたい(ruff format)
$ ruff format
$ ruff format --check
$ ruff format --diff
$ ruff format ファイル名
formatコマンドでフォーマッターとして利用できます。
引数にファイル名を指定したり、確認したいディレクトリでruff format .を指定して実行します。
1[tool.ruff]
2line-length = 100
3
4[tool.ruff.format]
5quote-style = "double"
リンターしたい(ruff check)
$ ruff check .
$ ruff check ファイル名
ruff checkコマンドでリンターを実行します。
引数にファイル名やディレクトリを指定できます。
ruff check .でプロジェクト内のすべての該当するファイルを指定できます。
$ ruff check --show-fixes
$ ruff check --fix
--show-fixesで修正が必要な箇所を表示します。
--fixで軽微な修正を自動修正できます。
修正された箇所はターミナルに出力されます。
$ ruff check ファイル名 --select カテゴリ記号
$ ruff check . --select ALL
$ ruff check . --select E F W I D
--selectオプションを使って、チェックしたいカテゴリーやエラー番号などを指定できます。
$ ruff check --statistics
$ ruff check --statistics --select ALL
--statisticsオプションと--select ALLを使って、
どのルールを有効にすればよいか確認できます。
ルールを確認したい(ruff rule)
$ ruff rule ルールID
selectやignoreで設定できるカテゴリ記号は公式ドキュメントの「ルール」に書いてあります。
どんなものがあるかなと思って書き写してみたら、なんと58種類もありました。
E,W:pycodestyleF:PyflakesC90:mccabeI:isortN:pep8-namingD:pydocstyleUP:pyupgradeYTT:flake8-2020ANN:flake8-annotationsASYNC:flake8-asyncTRIO:flake8-trioS:flake8-banditBLE:flake8-blind-exceptFBT:flake8-boolean-traB:flake8-bugbearA:flake8-builtinsCOM:flake8-commasCPY:flake8-copyrightC4:flake8-comprehensionsDTZ:flake8-datetimezT10:flake8-debuggerDJ:flake8-djangoEM:flake8-errmsgEXE:flake8-executableFA:flake8-future-annotationsISC:flake8-implicit-str-concatICN:flake8-import-conventionsG:flake8-logging-formatINP:flake8-no-pep420PIE:flake8-pieT20:flake8-printPYI:flake8-pyiPT:flake8-pytest-styleQ:flake8-quotesRSE:flake8-raiseRET:flake8-returnSLF:flake8-selfSLT:flake8-slotsSIM:flake8-simplifyTID:flake8-tidy-importsTCH:flake8-type-checkingINT:flake8-gettextARG:flake8-unused-argumentsPTH:flake8-use-pathlibTD:flake8-todosFIX:flake8-fixmeERA:eradicatePD:pandas-vetPGH:pygrep-hooksPL:pylintTRY:tryceratopsFLY:flyntNPY: NumPy-specific rulesAIR:AirflowPERF:PerflintFURB:refurbLOG:flake8-loggingRUF: Ruff-specific rules
コミットフックしたい(ruff-pre-commit)
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.6.7
hooks:
# ruff check
- id: ruff
# ruff format
- id: ruff-format
ruff用のフックがあるので、pre-commitと連携させることができます。
id: ruffを有効にすると
ruff check .が実行されます。
ファイルは修正されません。
id: ruff-formatを有効にすると
ruff format .が実行されます。
ファイルは修正されます。