このツールでできること
Python フォーマッターは、Python コードを広く使われている Black スタイルに書き直します。一貫したインデント、演算子の前後のスペース、ダブルクォート、トップレベルの定義の間の 2 行の空行、適切な位置での長い行の折り返しなどです。
内部では、Rust で書かれた高速な Python リンター兼フォーマッター Ruff のフォーマッターを WebAssembly にコンパイルして実行しています。Ruff の出力はほぼ 1 行単位で Black と一致するため、ここで整形したコードがプロジェクトの pre-commit フックで再整形されることはありません。
使い方
- Python コードを貼り付けるか、
.pyファイルを開きます。 - 入力に合わせて、整形されたコードが右側に表示されます。
- プロジェクトで別のスタイルを使っている場合はオプションを調整します。
- インデント:スペース 4 つが PEP 8 で、既定値です。スペース 2 つとタブも選べます。
- 行の幅:88 は Black の既定値、79 は PEP 8 の上限です。広い画面には 100 や 120 が向いています。
- 引用符:ダブル、シングル、または各文字列の引用符をそのまま残します。
- 末尾のカンマを尊重:カンマで終わるコレクションを展開したままにします。
- 結果をコピーまたはダウンロードします。
コードを解析できない場合は、4 行目の Expected `,`, found `=` のように、パーサーが停止した位置がエラーメッセージに表示され、その行へジャンプできます。
例
サンプルは雑に書かれた小さなモジュールです。スペースなしで 1 行に並んだ import、コロンの前にスペースがある dataclass、スペース 2 つでインデントされたメソッド、1 行で書かれた if 文が含まれています。整形すると、すべてのブロックがスペース 4 つのインデントになり、if の本体は独立した行に移り、演算子の前後にスペースが入り、シングルクォートはダブルクォートになり、クラスと関数の間に空行が追加されます。末尾がカンマで終わっていたリストは、辞書 1 つにつき 1 行に展開されます。
フォーマッターがしないこと
整形で変わるのはレイアウトだけです。import の並べ替え、未使用変数の削除、名前の変更は行いません。それらはリンターの仕事です(ruff check --fix で対応できます)。コメントと docstring は保持され、解析できないコードを推測で変更することはありません。
ヒント
- プロジェクトの
pyproject.tomlと同じ行の幅を使えば、結果が CI と一致します。 - 質問やレビューに投稿する前にスニペットを整形しておくと、ずっと読みやすくなります。
- ノートブックやチャットから持ってきたコードでタブとスペースが混在していても、フォーマッターが一度で統一します。
よくある質問
› 出力は Black と同じですか?
Ruff のフォーマッターは Black のドロップイン置き換えとして設計されており、大規模な実プロジェクトで 99.9% 以上の行が Black と同じ出力になります。ここでの既定の設定(スペース 4 つのインデント、88 桁、ダブルクォート)は Black の既定値です。
› 「マジックトレーリングカンマ」とは何ですか?
リスト、呼び出し、定義の末尾にカンマがあると、Black と Ruff は 1 行に収まる場合でも要素を 1 行に 1 つずつ展開したままにします。このスイッチをオフにすると、収まる場合はそうしたコレクションを 1 行にまとめます。
› どの Python バージョンに対応していますか?
パーサーは、match 文、型パラメーターリスト、入れ子の引用符を含む f-string など、モダンな Python 3 の構文を理解します。`print "x"` のような Python 2 のコードは構文エラーになります。
› コードはアップロードされますか?
いいえ。Ruff の WebAssembly モジュールを一度ダウンロードするだけで、整形はブラウザ内で行われます。