1 はじめに
日常的なPythonコードの開発において、個人の経験やプログラミング習慣の違いにより、書かれたコードの可読性には大きな差があります。経験豊富な開発者は、一目で分かりやすい整然としたコードを書くことができますが、一方で、一部の開発者は非常に「雑な」コードを書き、読むのが困難になることがあります。
美しくフォーマットされた、可読性の高いPythonコードを書くためには、大量のコードを書く過程で良い習慣を身につけるだけでなく、コードフォーマッターツールを活用してコードの自動フォーマットを実現することもできます。代表的なPythonコードフォーマッターツールには、autopep8、black、yapfなどがあり、vscode、pycharmなどの主要なIDEで関連プラグインをインストールして簡単に使用できます。
昨年人気を博したコード静的解析ツールruffは、主な機能にコードフォーマット機能が含まれています。その基盤がRustで書かれているため、関連機能を実行する際の処理速度は非常に速く、公式によると他の同種ツールの10~100倍にも達すると言われています⚡。本記事では、ruffを基にしたコードフォーマットの一般的な機能を紹介します😉。
2 ruffを使用したPythonコードのフォーマット
2.1 ruffのインストール
主要なIDEでは、ruff関連プラグインを直接インストールできます。vscodeを例に挙げると、拡張機能からruffを検索してインストールするだけです:
2.2 ruffのコードフォーマット機能
2.2.1 直接使用
ruffプラグインをインストールすると、vscodeでshift+alt+fショートカットキーを使用して、現在編集中のpyファイルをフォーマットできます。例えば、元のPythonコードのフォーマットが「うっかり」以下のような💩のようになったとします:
import os
# ターゲットパス下の各ファイルの作成時間と最終更新時間を抽出
target_dir = "data_folder"
# 除外するファイル拡張子
excluded_extensions = ['.mp4', '.avi', '.rmvb']
# 結果タプル形式:(ファイル名、作成時間、最終更新時間)
file_data = [(filename, os.path.getctime(os.path.join(target_dir, filename)), os.path.getmtime(
os.path.join(target_dir, filename))) for filename in os.listdir(target_dir)
# 現在のファイル名がファイルであり、除外拡張子リストに含まれていないか確認
if os.path.isfile(os.path.join(target_dir, filename)) and
not any(filename.endswith(ext) for ext in excluded_extensions)]
shift+alt+fを押すと、気分が一気に爽快になります~
2.2.2 フォーマットルールの設定
ruffのデフォルトのフォーマットルールは基本的にblackと互換性がありますが、もし特定のフォーマットルールを「カスタマイズ」したい場合は、たとえばクォートの使用について、単一引用符を優先的に使用したい場合でも、ruffで簡単に実現できます。
ruffでは、具体的な「プロジェクト」をコントロール範囲とし、プロジェクトのルートディレクトリにpyproject.tomlまたはruff.tomlを作成して具体的なルールを記述することが推奨されています。以下のサンプルruff.tomlファイルでは、単一引用符の優先使用を宣言しています:
ruff.toml
[format]
# 単一引用符を使用
quote-style = "single"
フォーマット結果では、対応して単一引用符が優先的に使用されます:
または、各行の最大文字数を制限することもできます:
ruff.toml
# 各行の最大文字数を20に制限
line-length = 20
[format]
# 単一引用符を使用
quote-style = "single"
インデントに単一のTab文字を使用するように設定(デフォルトは4つのスペース):
ruff.toml
[format]
# 単一引用符を使用
quote-style = "single"
# インデントに単一のtabを使用
indent-style = "tab"
さらに、ruffはdocstringコメント内のコードスニペットを認識してフォーマットすることもサポートしています:
ruff.toml
[format]
# 単一引用符を使用
quote-style = "single"
# docstringコードスニペットのフォーマットを有効化
docstring-code-format = true
ruffのコードフォーマット機能の詳細については、https://docs.astral.sh/ruff/formatter/を参照してください。