Python 3 エンジニア認定実践試験対策 (6) - Black


Pythonを数年使ってきて、改めて知識の整理と最新仕様のキャッチアップのために Python 3 エンジニア認定実践試験を受験しようと思い、私的に作成した資料から簡易版を作成しました。
最後に練習問題を設けましたので、解説を読んだら記憶定着のために練習問題へチャレンジしてください。最後に答えを掲載しています。

### Blackとは

- **目的**: Blackはフォーマッターです。PEP8コーディング規約に従ってコードを自動整形します。PEP8で決められていない部分についても、Black独自の仕様で強制フォーマットすることで、コードの可読性を向上させ、開発者をロジックに集中させることを目指しています。

- **利点**: コードフォーマットに関する議論を減らし、チーム全体で一貫したスタイルを保つことができます。手動でのフォーマット設定変更がほぼできないため、チームメンバー間でのスタイルの不一致を防ぎます。

### Blackのインストール
```bash
$ pip install black
```

### フォーマットの実行
特定のPythonファイルを整形するには、次のコマンドを使用します。
```bash
$ black your_script.py
```

### Blackと併用されるライブラリ - isort
- **isort**: import文の順序を自動で修正するツールです。Blackはimport文の順序をチェックしないため、isortと併用することが推奨されます。
- **詳細**: [isortの公式ドキュメント](https://pycqa.github.io/isort/)

### Blackの主要な設定オプション
- `--line-length`: 1行の最大文字数を指定します（デフォルトは88文字）。
- `--check`: コードをチェックするだけで、自動修正は行いません。
- `--diff`: 修正が必要な箇所を表示しますが、ファイルの自動修正は行いません。
- `--include`: 正規表現を使用して、特定の.pyファイルのみを対象にします。
- `--exclude`: 除外するファイルを正規表現で指定します。Gitの除外ファイル（.gitignore）に指定されているファイルは自動的に除外されます。

### オプション設定ファイル
Blackの設定は`pyproject.toml`ファイルに記述できます。以下は設定の例です。
`pyproject.toml`ファイルはプロジェクトディレクトリ直下に配置することで自動的に読み込まれます。

```toml
[tool.black]
line-length = 99
exclude = 'tests/'
```

### Blackの活用
BlackはVSCodeやPyCharmなどのエディターと連携して使用できます。エディターでの設定方法は以下のリンクを参照してください。
- [VSCodeでの設定方法](https://black.readthedocs.io/en/stable/integrations/editors.html)

### 開発時の自動チェック戦略
Flake8やmypyなどの静的解析ツールと併用することが推奨されます。これにより、コードの品質を保ちながら開発を進めることができます。チーム開発の場合、設定ファイルを共有することが重要です。

| ファイル種別 | ツール |
|--------------|--------|
| Black        | pyproject.toml |
| Flake8      | .flake8, setup.cfg |
| mypy         | mypy.ini |

### Blackのエラーと対処法
BlackとFlake8を併用する際には、衝突が発生することがあります。Flake8の設定に以下を追加することで、衝突を回避できます。
```ini
[flake8]
max-line-length = 88
extend-ignore = E203
```

---
# 確認問題

1. Blackの主な目的は何ですか？
   a) コードの実行速度を向上させること  
   b) Pythonコードを自動的に整形すること  
   c) コードのバグを自動的に修正すること  
   d) コードのコメントを自動生成すること  

2. Blackが遵守するコーディング規約は何ですか？
   a) PEP8  
   b) PEP20  
   c) PEP257  
   d) PEP484  

3. Blackをインストールするために使用するコマンドはどれですか？
   a) pip install black  
   b) install black  
   c) pip add black  
   d) black install  

4. Blackで特定のPythonファイルを整形するためのコマンドはどれですか？
   a) black format your_script.py  
   b) black your_script.py  
   c) format your_script.py with black  
   d) python black your_script.py  

5. Blackと併用されるライブラリは何ですか？
   a) flake8  
   b) isort  
   c) mypy  
   d) pytest  

6. Blackのデフォルトの行長は何文字ですか？
   a) 72文字  
   b) 80文字  
   c) 88文字  
   d) 99文字  

7. Blackの設定を記述するファイルは何ですか？
   a) settings.py  
   b) black.toml  
   c) pyproject.toml  
   d) config.py  

8. Blackの`--check`オプションの役割は何ですか？
   a) コードを自動修正する  
   b) コードをチェックするだけで修正は行わない  
   c) コードの実行速度を測定する  
   d) コードのスタイルを変更する  

9. Blackの`--exclude`オプションは何を指定しますか？
   a) 除外するファイルを正規表現で指定する  
   b) 特定のファイルを強制的にフォーマットする  
   c) フォーマットの対象外とするディレクトリを指定する  
   d) フォーマットの対象とするファイルを指定する  

10. BlackとFlake8を併用する際に、衝突を回避するためにFlake8に追加する設定は何ですか？
    a) max-line-length = 72  
    b) extend-ignore = E203  
    c) max-line-length = 99  
    d) ignore = E203  

11. Blackの設定ファイルはどこに配置する必要がありますか？
    a) プロジェクトの任意のディレクトリ  
    b) プロジェクトディレクトリ直下  
    c) ユーザーディレクトリの任意のディレクトリ  
    d) システムディレクトリ  

12. Blackを使用することで得られる利点は何ですか？
    a) コードの実行速度が向上する  
    b) コードフォーマットに関する議論が減る  
    c) コードのバグが自動的に修正される  
    d) コードのコメントが自動生成される  

13. Blackの`--diff`オプションは何を表示しますか？
    a) 修正が必要な箇所を表示する  
    b) 自動修正を行う  
    c) コードの実行結果を表示する  
    d) コードのエラーを表示する  

解答:
1. b  
2. a  
3. a  
4. b  
5. b  
6. c  
7. c  
8. b  
9. a  
10. b  
11. b  
12. b  
13. a