flake8のプラグインをいろいろ試してみた

こんにちは、[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている者です。
今回は、flake8で少し遊んでみようと思います。

##flake8のインストール

flake8とは、pythonのコードチェッカーツールです。
flake8をインストールする前に、pythonをインストールしておきます。
その後、pipを使ってflake8をインストールします。

```bash:command
$ pip install flake8
```
##flake8をデフォルトで使ってみる

インストールしたら、まずはデフォルトの状態で使ってみたいと思います。
そのためのテストコードを以下のように書きます。

```python:test.py
import sys
import math

a= int(input())
b =  2

def calc(a, b):
    return a+ b

c = calc(a,b)

print('a+b='+ str(c))
```

テストコードが書けたら、一度実行してみます。

```bash:command
$ python test.py
4 ←aの値の入力
a+b=6
```

正常に出力されました。
しかし、このコードに対して、flake8を用いると、コードの書き方についてさまざまな警告がなされます。

```bash:command
$ flake8 test.py
test.py:1:1: F401 'sys' imported but unused
test.py:2:1: F401 'math' imported but unused
test.py:4:2: E225 missing whitespace around operator
test.py:5:4: E222 multiple spaces after operator
test.py:7:1: E302 expected 2 blank lines, found 1
test.py:8:13: E225 missing whitespace around operator
test.py:10:1: E305 expected 2 blank lines after class or function definition, found 1
test.py:10:11: E231 missing whitespace after ','
test.py:12:13: E225 missing whitespace around operator
```

警告の内容としては、以下の通りです。
F401：モジュールをインポートしているが、使っていない
E222：スペースが二つ以上連続している
E225：演算子（+、=など）の両側をスペースで空けていない
E231：カンマの後にスペースがない
E302,305：関数やクラスの前後は２行空ける

##プラグインを追加する

では、flake8のプラグインを追加していきます。
プラグインの種類は、pipを使って調べられます。

```bash:command
$ pip search flake8
flake8-quotes (2.1.0)                   - Flake8 lint for quotes.
flake8-setuptools (0.0.0)               - Flake8 integration with Setuptools
flake8-expandtab (0.3)                  - flake8 for tab junkies
flake8-chart (0.1.5)                    - flake8 stats visualised
...
```

###flake8-import-order

まずは、flake8-import-orderを試してみます。
flake8-import-orderは、モジュールがアルファベット順にインポートされているかをチェックします。
では早速インストールして使ってみます。

```bash:command
$ pip install flake8-import-order
Collecting flake8-import-order
...
Successfully installed flake8-import-order-0.18.1
$ flake8 test.py
test.py:1:1: F401 'sys' imported but unused
test.py:2:1: I100 Import statements are in the wrong order. 'import math' should be before 'import sys'
test.py:2:1: F401 'math' imported but unused
...
```

すると、I100という警告が追加されました。
これは、mathの方がsysよりもアルファベット順で先だから、mathを先にインポートするべきだという警告です。

###flake8-docstrings

次に、flake8-docstringsを試してみます。

```bash:command
$ pip install flake8-docstrings
Collecting flake8-docstrings
...
Successfully installed flake8-docstrings-1.4.0 pydocstyle-4.0.1 snowballstemmer-1.9.1
$ flake8 test.py
test.py:1:1: D100 Missing docstring in public module
...
test.py:7:1: D103 Missing docstring in public function
...
```

すると、D100、D103という警告が追加されました。
これらは、それぞれ公開モジュール、関数の説明をdocstrings（"""..."""）を用いてしなさいという警告です。
試しに、calc関数を説明してみます。

```python:test.py
...

def calc(a, b):
    """Calculate a+b."""
    return a+ b

...
```

そして、もう一度flake8を実行してみると、

```bash:command
$ flake8 test.py
...
test.py:5:4: E222 multiple spaces after operator
test.py:7:1: E302 expected 2 blank lines, found 1
test.py:9:13: E225 missing whitespace around operator
...
```
7行目のD103が消えました。

##まとめ

今回は、flake8でいろいろなプラグインを試してみました。
他にもさまざまなプラグインがありますので、また試してみたいと思います。
記事の中に間違いがありましたら、修正しますので、ご指摘のほどよろしくお願いいたします。