2
5

Pythonのコード品質向上: pylint, black, isortを使った自動コード整形と静的解析

Posted at

はじめに

Pythonプロジェクトの品質を保つことは、長期的な保守性と読みやすさを確保するために非常に重要です。本記事では、Pythonの代表的なコード品質向上ツールである pylint, black, isort の使用方法と、これらを組み合わせた効果的な開発ワークフローについて解説します。

image.png

1. pylint: 強力な静的解析ツール

pylintは、Pythonコードの品質チェックと静的解析を行う強力なツールです。

インストール

pip install pylint

使用方法

pylint your_script.py

実行例

以下のようなPythonスクリプト(example.py)があるとします:

def greet(name):
    print("Hello, " + name + "!")

greet("Alice")
unused_var = 10

pylintを実行すると:

$ pylint example.py
************* Module greet_script
greet_script.py:1:0: C0114: Missing module docstring (missing-module-docstring)
greet_script.py:2:0: C0116: Missing function or method docstring (missing-function-docstring)
greet_script.py:6:0: C0103: Constant name "unused_var" doesn't conform to UPPER_CASE naming style (invalid-name)

-----------------------------------
Your code has been rated at 2.50/10

pylintは、命名規則、ドキュメント、未使用変数などの問題を指摘します。

主な機能

  • コーディング規約違反の検出
  • エラーや潜在的な問題の指摘
  • コードの複雑さの分析
  • 重複コードの検出

カスタマイズ

.pylintrcファイルを使用して、プロジェクトごとにルールをカスタマイズできます。

2. black: 意見の余地なしの自動フォーマッタ

blackは、PEP 8に準拠した一貫性のあるコードスタイルを自動的に適用します。

インストール

pip install black

使用方法

black your_script.py

実行例

以下のようなPythonスクリプト(example.py)があるとします:

def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(f'{var_one} {var_two} {var_three} {var_four}')

long_function_name('hello', 'world', 'python',
                   'formatting')

blackを実行すると:

$ black example.py
reformatted example.py

All done! ✨ 🍰 ✨
1 file reformatted.

実行後のexample.py

def long_function_name(var_one, var_two, var_three, var_four):
    print(f"{var_one} {var_two} {var_three} {var_four}")


long_function_name("hello", "world", "python", "formatting")

特徴

  • 設定不要で即座に使用可能
  • 一貫性のあるフォーマットを強制
  • コードレビューでのスタイル議論を減少

3. isort: インポート文の整理

isortは、Pythonのimport文を自動的に整理し、一貫性のある形式にフォーマットします。

インストール

pip install isort

使用方法

isort your_script.py

実行例

以下のようなPythonスクリプト(example.py)があるとします:

import sys
import os
from my_module import my_function
import numpy as np
from datetime import datetime

isortを実行すると:

$ isort example.py
Fixing example.py

実行後のexample.py

import os
import sys
from datetime import datetime

import numpy as np

from my_module import my_function

主な機能

  • インポート文のアルファベット順整列
  • セクションごとの分類(標準ライブラリ、サードパーティ、ローカル)
  • 複数行インポートの最適化

統合ワークフロー

これら3つのツールを組み合わせることで、効果的なコード品質管理ワークフローを構築できます。

  1. コード作成
  2. isortでインポート文を整理
  3. blackでコードフォーマットを統一
  4. pylintで静的解析を実行

このワークフローを自動化するために、pre-commitフックやCIパイプラインを使用することをおすすめします。

統合ワークフローの実行例

以下のようなexample.pyファイルがあるとします:

import sys
import os
from datetime import datetime
import numpy as np
from my_module import my_function

def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(f'{var_one} {var_two} {var_three} {var_four}')

long_function_name('hello', 'world', 'python',
                   'formatting')

unused_var = 10

統合ワークフローを実行:

$ isort example.py
$ black example.py
$ pylint example.py

最終的なexample.py

import os
import sys
from datetime import datetime

import numpy as np

from my_module import my_function


def long_function_name(var_one, var_two, var_three, var_four):
    print(f"{var_one} {var_two} {var_three} {var_four}")


long_function_name("hello", "world", "python", "formatting")

unused_var = 10

pylintの出力:

************* Module example
example.py:10:0: C0103: Function name "long_function_name" doesn't conform to snake_case naming style (invalid-name)
example.py:10:0: C0116: Missing function or method docstring (missing-function-docstring)
example.py:15:0: W0612: Unused variable 'unused_var' (unused-variable)

-----------------------------------
Your code has been rated at 6.67/10

まとめ

pylint, black, isortを使用することで、Pythonプロジェクトのコード品質を大幅に向上させることができます。これらのツールを日常的な開発プロセスに組み込むことで、一貫性のある、読みやすく、メンテナンスしやすいコードベースを維持することができるでしょう。実行例からわかるように、各ツールは異なる側面からコードの品質向上に貢献します。これらを組み合わせることで、より効果的なコード品質管理が可能になります。

image.png

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5