Pythonの主要なLint(pep8, pylint, flake8)の設定方法まとめ

ちょっとしたメモ書き。

- pep8
- pylint
- flake8

のそれぞれで、「一部の警告をチェック対象から除外する」などの設定を行いたいときの
設定ファイルの書き方と置き場所を整理。

参考：[[Python]pep8とpylintの設定ファイルを作成して一部の警告を非表示にする - dackdive's blog](http://dackdive.hateblo.jp/entry/2016/01/25/123631)
上記ブログ記事に flake8 の情報を追加したものです。

# 要約

いずれも、設定ファイルは `~/.config/` ディレクトリ下に作れば良い。（その他の選択肢もある）
ファイル名は

- pep8 -> `pep8`
- pylint -> `pylintrc`
- flake8 -> `flake8`

と、pylint だけ注意。
設定ファイルの書式も pylint のみ異なる。

# [pep8](http://pep8-ja.readthedocs.org/ja/latest/)


### 設定ファイルの場所

http://pep8.readthedocs.org/en/latest/intro.html#configuration
によると、

> If on Windows:
　`~\.pep8`
Otherwise, if the `XDG_CONFIG_HOME` environment variable is defined:
　`XDG_CONFIG_HOME/pep8`
Else if `XDG_CONFIG_HOME` is not defined:
　`~/.config/pep8`

なので、`XDG_CONFIG_HOME` を設定していない Mac の場合は 

```
~/.config/pep8
```

で良さそうです。


### 設定ファイルの書き方

同じく http://pep8.readthedocs.org/en/latest/intro.html#configuration にあるように、

```ini:~/.config/pep8
[pep8]
ignore = E226,E302,E41
max-line-length = 160
```

`ignore =` の後ろにカンマ区切りで無視したい警告のコードを記述します。

コードはここから確認します。
http://pep8.readthedocs.org/en/latest/intro.html#error-codes


# [pylint](http://www.pylint.org/)

### 設定ファイルの場所

https://pylint.readthedocs.io/en/latest/user_guide/run.html#command-line-options
によると、pylint の設定ファイルは以下のような順序で探索して最初に見つかったものが読み込まれるそう。

> 1. `pylintrc` in the current working directory
2. `.pylintrc` in the current working directory
3. If the current working directory is in a Python module, Pylint searches up the hierarchy of Python modules until it finds a `pylintrc` file. This allows you to specify coding standards on a module-by-module basis. Of course, a directory is judged to be a Python module if it contains an `__init__.py` file.
4. The file named by environment variable `PYLINTRC`
5. if you have a home directory which isn’t `/root`:
    1. `.pylintrc` in your home directory
    2. `.config/pylintrc` in your home directory
6. `/etc/pylintrc`

ざっくり和訳すると

1. 現在の working directory にある `pylintrc`
2. 現在の working directory にある `.pylintrc`
3. 現在の working directory が Python のモジュールのディレクトリだった場合（`__init__.py` が存在するディレクトリの場合）、`pylintrc` を見つけるまで階層を上に辿る。  
これによりモジュール単位で `pylintrc` を設定することができる（し、ファイルがないモジュールはプロジェクトのルートにある `pylintrc` が使える）
4. 環境変数 `PYLINTRC` で指定したファイル
5. `/root` 以外の home ディレクトリがあった場合：
    1. home ディレクトリ直下の `.pylintrc`
    2. `$HOME/.config/pylintrc`
6. `/etc/pylintrc`

といったところでしょうか。
working directory はおそらく `pylint` コマンドを実行した時の位置になるんだと思います。

私は pep8 と同じく `~/.config` ディレクトリの下に配置するよう

```
~/.config/pylintrc
```

としました。

### 設定ファイルの書き方

`--generate-rcfile` オプションつきで pylint を実行すると設定ファイルのテンプレートが出力されるので、適当なファイルに保存します。

```zsh
$ pylint --generate-rcfile > ~/.config/pylintrc
```

生成した `pylintrc` ファイルに `disable=` という変数があるのでそこに無視したい警告のコードを書きます。  

```ini:~/.config/pylintrc
# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifiers separated by comma (,) or put this
# option multiple times (only on the command line, not in the configuration
# file where it should appear only once).You can also use "--disable=all" to
# disable everything first and then reenable specific checks. For example, if
# you want to run only the similarities checker, you can use "--disable=all
# --enable=similarities". If you want to run only the classes checker, but have
# no Warning level messages displayed, use"--disable=all --enable=classes
# --disable=W"
disable=
  oct-method,
  ext-method-called,
  C0111
```

コードはここから検索できます。
http://pylint-messages.wikidot.com/all-codes

また、コードのかわりに symbolic name と呼ばれる、コードよりも内容が推測できる名称での指定もできるようです。
（上の `oct-method` や `ext-method-called` がそうです）
http://docs.pylint.org/faq.html#do-i-have-to-remember-all-these-numbers

symbolic name はここからコードを元に調べられそう。
http://docs.pylint.org/features.html#

また、手元で試した限りコード(または symbolic name)は改行で区切っても問題ないようです。

# [flake8](http://flake8.readthedocs.org/en/latest/index.html)

### 設定ファイルの場所

http://flake8.readthedocs.org/en/latest/config.html
によると Windows 以外は

```
~/.config/flake8
```

です。(Windows の場合 `~/.flake8`)

また、プロジェクト単位では `tox.ini` または `setup.cfg` というファイルがあると
そちらに記載した設定も自動的に読み込まれるようです。
（書き方は↓と同じ）

### 設定ファイルの書き方

同じく http://flake8.readthedocs.org/en/latest/config.html によると、

```ini:~/.config/flake8
[flake8]
ignore = E226,E302,E41
max-line-length = 160
exclude = tests/*
max-complexity = 10
```

というように、pep8 と同じ形式で OK です。

コードはここから確認します。
`F***` 系: http://flake8.readthedocs.org/en/latest/warnings.html
`E***`, `W***` (pep8) 系: http://pep8.readthedocs.org/en/latest/intro.html#error-codes