hatchでAzure Functions(Python版)のLintチェックをしながらリファクタリングする
この記事はhatchプロジェクトでAzure Functions(Python版)のLintチェックを行うためのメモです。
Azure FunctionsはちょっとしたPythonAPIを動かすのにちょうど良いFaaS(Function as a Service)です。
しかし無造作に機能追加していくと、あとで見返すときに読みづらかったり、人が理解しづらいコードになってしまいます。
PythonではPEP8というコーディング規約があり、それに沿ってコーディングすることで、ある程度見やすいコードを書くことができます。
それらの規約に沿っているかどうかチェックするためのツールがLintチェックツールであり、今回はその設定をhatchプロジェクトに加えます。
これによって、後から見て理解しやすく、人に見せても恥ずかしくないコードになっているかチェックしながら開発を進めることができます。
ここでは、過去に作成したAzure Functionsに対してLintチェックを追加しながらリファクタリングを進めていきます。
過去に作成したAzure Functionsについては下記の通り。
- 基本編
- Azure Functions編
今回はAzure Functions編のため、作業ディレクトリは下記になります。
~/devel/sandbox_azure_functions
1. hatchにLintチェックの設定を追加し、実行する
1.1. pyproject.tomlにLintチェック用の設定を記入する
pyproject.toml
ファイルの末尾に、Lintチェック用の設定を追記します。
〜〜〜〜〜(前略)〜〜〜〜〜
[tool.pytest.ini_options]
pythonpath = "."
testpaths = ["tests"]
+ [tool.hatch.envs.style]
+ detached = true
+ dependencies = [
+ "flake8",
+ "black",
+ "isort",
+ "pyproject-flake8",
+ ]
+ [tool.hatch.envs.style.scripts]
+ check = [
+ "pflake8 .",
+ "black --check --diff .",
+ "isort --check-only --diff .",
+ ]
+ fmt = [
+ "isort .",
+ "black .",
+ "check",
+ ]
+ [tool.flake8]
+ max-line-length = 120
+ exclude = [
+ ".git",
+ "__pycache__",
+ "build",
+ "dist",
+ ".venv",
+ ]
+
1.2. Lintチェックを実行する
前項で記載した設定を使って、Lintチェックを実施します。
hatch run style:check
cmd [1] | pflake8 .
./function_app.py:2:1: F401 'datetime' imported but unused
./function_app.py:8:1: E302 expected 2 blank lines, found 1
./function_app.py:29:121: E501 line too long (175 > 120 characters)
./function_app.py:32:10: W292 no newline at end of file
どうやら雛形から作られた function_app.py
がLintチェックに引っかかったようです。
1.3. 自動修正を実行する
先ほど追記した設定には、ある程度自動修正する設定も入っています。
それを使って修正を試みます。
hatch run style:fmt
cmd [1] | isort .
Fixing ~/devel/sandbox_azure_functions/function_app.py
Skipped 4 files
cmd [2] | black .
reformatted ~/devel/sandbox_azure_functions/function_app.py
All done! ✨ 🍰 ✨
1 file reformatted, 3 files left unchanged.
cmd [3] | flake8 .
./function_app.py:1:1: F401 'datetime' imported but unused
./function_app.py:37:121: E501 line too long (168 > 120 characters)
Lintチェック時には4件あった指摘が、2件まで減りました。
この2件は手動で対応していきます。
1.3. 最終調整を手動で実行する
最後に残ったのは『datetime
に対してimport宣言があるのに使われていない件』と、『行が長すぎる件』の2件です。
エディタで function_app.py
を開いて下記のように修正します。
- import datetime
import json
import logging
import azure.functions as func
〜〜〜〜〜(中略)〜〜〜〜〜
else:
return func.HttpResponse(
json.dumps(
{
- "message": "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
+ "message": (
+ "This HTTP triggered function executed successfully."
+ + " Pass a name in the query string or in the request body for a personalized response."
+ )
}
),
〜〜〜〜〜(後略)〜〜〜〜〜
再度チェックを行います。
hatch run style:check
cmd [1] | pflake8 .
cmd [2] | black --check --diff .
All done! ✨ 🍰 ✨
7 files would be left unchanged.
cmd [3] | isort --check-only --diff .
Skipped 4 files
無事にLintチェックを通過しました。
1.4. テストを実行して問題がないことを確認する
最後に、今回の修正で機能的な問題が起きていないか、テストを実行してチェックします。
hatch run test
=========================== test session starts ============================
platform darwin -- Python 3.11.6, pytest-7.4.4, pluggy-1.3.0
rootdir: ~/devel/sandbox_azure_functions
configfile: pyproject.toml
collected 4 items
tests/test_function_app.py .... [100%]
============================ 4 passed in 0.09s =============================
テストが通っているので、今回のリファクタリングは完了と判断できます。
1.5. ここまでの作業を記録する
ここまで作業した内容をGitリポジトリに記憶します。
git add .
git commit -m "function_app.pyにLintチェックを適用してリファクタリングを実施"
[main 8b4ab61] function_app.pyにLintチェックを適用してリファクタリングを実施
2 files changed, 107 insertions(+), 12 deletions(-)
まとめ
今回はLintチェックの実施と、それに伴うリファクタリングを行いました。
Lintチェックはチームでの開発の際、コードの可読性を保つために有効です。
加えて個人開発でも、後から見てみやすいコードを書いておくことは、未来の自分を助けることにもつながりますので、積極的に導入していくことをお勧めします。
次回はインテグレーションテスト環境の作り方です。
次回の記事はこちら:
Discussion