もた日記

くだらないことを真面目にやる

Vimメモ : flake8でPythonのコードをチェックする

flake8


flake8とは

Flake8: Your Tool For Style Guide Enforcement — flake8 3.3.0 documentation
Pythonのコードチェックツールとしてはflake8が有名らしい。flake8は下記コードチェックツールのラッパーなので、flake8を使用することで広範囲のチェックが可能になる。


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はラッパーなので、各コマンドを実行すればそれぞれの結果が確認できる(pep8pycodestyleのコマンド)。

$ 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
によるとhackingflake8-import-orderなどがオススメのようだ。


エラーコード一覧

エラーとしてどのようなものがあるかは下記リンクで確認できる。pycodestyleのエラーはE、警告はWpyflakesF始まりのように分類されている。
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のインストール

deinの場合は下記行をdeinl.tomlなどに追加。

[[plugins]]
repo = 'scrooloose/syntastic'


synstasticの使い方

まずPython用のチェックツールとしてflake8を指定する。

let g:syntastic_python_checkers = ["flake8"]

正しく設定できているかは:SyntasticInfoで確認できる。Available checkersに利用可能なチェックツール、Currently enabled checkersに現在有効なチェックツールが表示される。

f:id:wonder-wall:20170205202622p:plain

正しく設定できていれば:SyntasticCheckを実行するとflake8の結果が表示される。

f:id:wonder-wall:20170205202828p:plain

また:Errosを実行すると結果の一覧が確認できる。

f:id:wonder-wall:20170205202420p:plain

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-flake8flake8専用なので、こっちの方が手軽かもしれない。

vim-flake8のインストール

deinの場合は下記行をdeinlazy.tomlなどに追加。

[[plugins]]
repo = 'nvie/vim-flake8'
on_ft = 'python'


vim-flake8の使い方

インストールが成功していればF7キーを押すことでflake8の結果がQuickfixに表示される。

f:id:wonder-wall:20170205203837p:plain

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  " ファイル内にマークを表示

図のように表示が変わる。

f:id:wonder-wall:20170205205750p:plain

追記:ALEで非同期コードチェック



非同期でコードチェックしたい場合はALE(Asynchronous Lint Engine)を使うとよい(NeovimまたはVim 8の場合)。

wonderwall.hatenablog.com

入門 Python 3

入門 Python 3