👏

hatchでAzure Functions(Python版)のLintチェックをしながらリファクタリングする

2024/01/06に公開

この記事はhatchプロジェクトでAzure Functions(Python版)のLintチェックを行うためのメモです。

Azure FunctionsはちょっとしたPythonAPIを動かすのにちょうど良いFaaS(Function as a Service)です。

しかし無造作に機能追加していくと、あとで見返すときに読みづらかったり、人が理解しづらいコードになってしまいます。

PythonではPEP8というコーディング規約があり、それに沿ってコーディングすることで、ある程度見やすいコードを書くことができます。

それらの規約に沿っているかどうかチェックするためのツールがLintチェックツールであり、今回はその設定をhatchプロジェクトに加えます。

これによって、後から見て理解しやすく、人に見せても恥ずかしくないコードになっているかチェックしながら開発を進めることができます。

ここでは、過去に作成したAzure Functionsに対してLintチェックを追加しながらリファクタリングを進めていきます。

過去に作成したAzure Functionsについては下記の通り。

  1. 基本編
    1. AzureStaticWebAppをReact+AzureFunctions(Python)で作って、ローカルで動かしてみる
  2. Azure Functions編
    1. Azure Functions(Python版)の試験をpytestで行う

今回はAzure Functions編のため、作業ディレクトリは下記になります。

~/devel/sandbox_azure_functions

1. hatchにLintチェックの設定を追加し、実行する

1.1. pyproject.tomlにLintチェック用の設定を記入する

pyproject.tomlファイルの末尾に、Lintチェック用の設定を追記します。

pyproject.toml

〜〜〜〜〜(前略)〜〜〜〜〜

[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 を開いて下記のように修正します。

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