Pythonコードを美しく書く方法:ruffを使ったコード整形のベストプラクティス

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/を参照してください。

タグ: ruff Python コードフォーマット 静的解析 rust

6月3日 19:12 投稿