Vimメモ : flake8でPythonのコードをチェックする
flake8
flake8とは
Flake8: Your Tool For Style Guide Enforcement — flake8 3.3.0 documentation
Pythonのコードチェックツールとしてはflake8
が有名らしい。flake8
は下記コードチェックツールのラッパーなので、flake8
を使用することで広範囲のチェックが可能になる。
- PyFlakes(pyflakes : コードのエラーチェック)
- pycodestyle(pycodestyle : PEP8に準拠しているかチェック)
- Ned Batchelder’s McCabe script(mccabe : 循環的複雑度のチェック)
flake8のインストール
pip
を使用している場合は、下記コマンドでインストールできる。
$ pip install flake8
pip show
の結果を見るとわかるように、ラップしている上記3つのツールがRequiresになっているので同時にインストールされる。
$ pip show flake8 Name: flake8 Version: 3.2.1 Summary: the modular source code checker: pep8, pyflakes and co Home-page: https://gitlab.com/pycqa/flake8 Author: Ian Cordasco Author-email: graffatcolmingov@gmail.com License: MIT Location: /home/vagrant/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/site-packages Requires: pycodestyle, mccabe, pyflakes
flake8の使い方
例えば下記Pythonコードをチェックしたいとする。
import sys a = 1 b = [1,2, 3 ] print("test")
以下のようにファイル名を指定してflake8
を実行すると、コードチェックの結果が表示される。コマンド引数はファイル名ではなく、ディレクトリ名を指定してもよい。
$ flake8 test.py test.py:1:1: F401 'sys' imported but unused test.py:3:4: E222 multiple spaces after operator test.py:4:7: E231 missing whitespace after ',' test.py:4:12: E202 whitespace before ']' test.py:6:1: W293 blank line contains whitespace test.py:6:1: W391 blank line at end of file
flake8
はラッパーなので、各コマンドを実行すればそれぞれの結果が確認できる(pep8
はpycodestyle
のコマンド)。
$ pyflakes test.py test.py:1: 'sys' imported but unused $ pep8 test.py test.py:3:4: E222 multiple spaces after operator test.py:4:7: E231 missing whitespace after ',' test.py:4:12: E202 whitespace before ']' test.py:6:1: W293 blank line contains whitespace test.py:6:1: W391 blank line at end of file
なお、mccabe
についてはここに書いてあるようにflake8
ではデフォルト無効になっており、以下のように--max-complexity
を指定すると循環的複雑度のチェックが可能になる。
$ flake8 --max-complexity 10 coolproject ... coolproject/mod.py:1204:1: C901 'CoolFactory.prepare' is too complex (14)
flake8プラグイン
Using Plugins For Fun and Profit — flake8 3.3.0 documentation
flake8
には色々なプラグインがあり、プラグインをインストールすればコードチェックの種類を追加できる。
例えば、説明文のdocstringsをチェックするflake8-docstrings
をインストールしたい場合は下記コマンドを実行。
$ pip install flake8-docstrings
インストール前は、
$ flake8 --version 3.2.1 (mccabe: 0.5.3, pycodestyle: 2.2.0, pyflakes: 0.8.1) CPython 3.5.2 on Linux
となっているものが、インストール後は以下のようにプラグインが追加されていることが確認できる。
$ flake8 --version 3.2.1 (pyflakes: 0.8.1, flake8-docstrings: 1.0.3, pydocstyle: 1.1.1, pycodestyle: 2.2.0, mccabe: 0.5.3) CPython 3.5.2 on Linux
プラグインのインストール後は特に設定の追加は必要なくflake8
を実行すればチェックができるようになっている。
どのようなプラグインがあるかはpip search
コマンドで確認可能。
$ pip search flake8 42cc-pystyle (0.0.16) - flake8 checks for 42 Coffee Cups style guide flake8-format-ansi (0.1.0) - ANSI error format plugin for flake8. flake8-plone-api (1.2) - Checks for code usages that can be replaced with Plone API method calls. flake8-author (1.1.2) - Flake8 __author__ checker …
Python の Lint (文法チェッカ) まとめ - flake8 + hacking を使う - - Qiita
によるとhacking
、flake8-import-order
などがオススメのようだ。
エラーコード一覧
エラーとしてどのようなものがあるかは下記リンクで確認できる。pycodestyle
のエラーはE
、警告はW
、pyflakes
はF
始まりのように分類されている。
Introduction — pycodestyle 2.3.1 documentation
Error / Violation Codes — flake8 3.3.0 documentation
syntasticによりVimでflake8を実行
github.com
flake8
を使えるようになったので、今度はvim
から使えるようにしてみる。シンタックスチェックプラグインとして有名なsyntastic
を使う方法とvim-flake
を使う方法があるので両方試してみる。synstasticの使い方
まずPython用のチェックツールとしてflake8
を指定する。
let g:syntastic_python_checkers = ["flake8"]
正しく設定できているかは:SyntasticInfo
で確認できる。Available checkers
に利用可能なチェックツール、Currently enabled checkers
に現在有効なチェックツールが表示される。
正しく設定できていれば:SyntasticCheck
を実行するとflake8
の結果が表示される。
また:Erros
を実行すると結果の一覧が確認できる。
synstasticの設定
推奨の設定はここに書いてある下記設定とのこと。
set statusline+=%#warningmsg# set statusline+=%{SyntasticStatuslineFlag()} set statusline+=%* let g:syntastic_always_populate_loc_list = 1 let g:syntastic_auto_loc_list = 1 let g:syntastic_check_on_open = 1 let g:syntastic_check_on_wq = 0
vim-flake8によりVimでflake8を実行
github.com
vim-flake8
はflake8
専用なので、こっちの方が手軽かもしれない。vim-flake8のインストール
deinの場合は下記行をdeinlazy.toml
などに追加。
[[plugins]] repo = 'nvie/vim-flake8' on_ft = 'python'
vim-flake8の設定
ファイル保存時に実行したい場合は下記設定を追加。
autocmd BufWritePost *.py call Flake8()
その他の設定としては以下のものがあり、
autocmd FileType python map <buffer> <F3> :call Flake8()<CR> " キーバインド変更 let g:flake8_quickfix_location="topleft" " Quickfixの位置 let g:flake8_quickfix_height=7 " Quickfixの高さ let g:flake8_show_in_gutter=1 " 左端にシンボルを表示 let g:flake8_show_in_file=1 " ファイル内にマークを表示
図のように表示が変わる。
追記:ALEで非同期コードチェック
非同期でコードチェックしたい場合はALE(Asynchronous Lint Engine)を使うとよい(NeovimまたはVim 8の場合)。

- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る