- 公開日
- 最終更新日
AWS Lambda の Python コードに ruff を導入してみた
この記事を共有する
目次
はじめに
AWS Lambda(以下、Lambda)の関数を書き足していくうちに、コードのスタイルがバラバラになっていると感じたことはないでしょうか。
文字列のクォートがシングルとダブルで混ざっていたり、使わなくなった import が残っていたりします。
Lambda は関数ごとにディレクトリが分かれるので全体を見渡す機会がなく、気づいたときには手を付けるのが億劫な量になっていました。
そこで今回は Python のリンター兼フォーマッタである ruff を導入してみました。
ruff の導入
ruff は Python 用のリンター兼フォーマッタです。
コードの書き方の問題を指摘する役割と、見た目を整える役割の両方を持ちます。
インストールは以下のコマンドです。
pip install ruff
実行するコマンドは 2 つあります。
ruff check がリンター、ruff format がフォーマッタです。
ruff check src tests
ruff format src tests
ruff check は問題のある書き方を見つけて報告します。
ruff format はコードの見た目を機械的に揃えます。
役割が違うので、両方を実行します。
設定は pyproject.toml に書きます。
今回の設定は以下のとおりです。
[tool.ruff]
line-length = 88
target-version = "py312"
[tool.ruff.lint]
select = ["E", "F", "W"]
ignore = ["E501"]
select は有効にするルールの種類、ignore は個別に無効化するルールです。
E501 を無視した理由
line-length はフォーマッタが折り返す目安の文字数で、E501 は「行が長すぎる」とリンターが出す警告です。
似ていますが、整形する側とチェックする側で別々に効きます。
ここで問題になるのが、フォーマッタは文字列の中身とコメントを折り返せない点です。
途中で切ると意味が変わるため、これは正しい挙動です。
日本語のコメントや通知メッセージは 1 行が長くなりがちなので、以下のような行が残ります。
MESSAGE = "処理が完了しました。結果の確認は管理画面から行ってください。"
この行は 88 文字を超えますが、フォーマッタは折り返せません。
つまり ruff format を実行した直後に ruff check を走らせても、E501 の警告が消えません。
警告を消すには文字列を手作業で分割することになりますが、メッセージを直すたびに同じ作業が発生します。
可読性も上がりません。
そこで line-length は残したまま E501 だけを無視しました。
フォーマッタには折り返しをさせつつ、リンターには行の長さで文句を言わせない、という使い分けです。
一括適用で何が変わったか
設定を決めてから、既存のコードにまとめて適用しました。
フォーマッタが直したのは主にクォートの統一でした。
シングルクォートとダブルクォートが混在していたものが、すべてダブルクォートに揃いました。
この手の指摘はレビューで言われても直すのが面倒なので、機械に任せられるのは楽です。
一方、リンターの指摘で価値があったのは使っていない import の検出です。
実装を書き換えるうちに不要になった import が残っていました。
動作には影響しませんが、Lambda の場合はコールドスタート時の読み込み対象が増えるため、消しておくに越したことはありません。

まとめ
今回は Lambda 用の Python コードに ruff を導入しました。
導入して一番よかったのは、スタイルの統一よりも使っていない import が見つかったことでした。
自分では気づけない小さな汚れが溜まっていたと分かり、機械的なチェックの価値を実感しています。
同じようにコードのスタイルが崩れてきたと感じている方の参考になれば幸いです。
この記事は私が書きました
野間 太一
記事一覧猫とCloudFormationが好きです。