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

## はじめに

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/04e28694-f4e3-7bec-cb18-eaa81f6656e1.png)

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

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

### インストール
```
pip install pylint
```

### 使用方法
```
pylint your_script.py
```

### 実行例

以下のようなPythonスクリプト（`example.py`）があるとします：

```python
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`）があるとします：

```python
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`：

```python
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`）があるとします：

```python
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`：

```python
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`ファイルがあるとします：

```python
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`：

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/b71cef9f-1068-38ee-decc-4ed9c7c89008.png)