flake8を試す
flake8 2.0 : Python Package Index
flake8はpythonのコードチェッカーで、以下の3つのツールのラッパーとなっている
- pyflakes
- pep8
- Ned Batchelder's McCabe script
McCabe scriptというのは循環的複雑度をチェックするもの(らしい)
mccabe 0.2.1 : Python Package Index
循環的複雑度 - Wikipedia
インストール
$ pip install flake8
ヘルプをみてみる
$ flake8 --help
Usage: flake8 [options] input ...
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-v, --verbose print status messages, or debug with -vv
-q, --quiet report only file names, or nothing with -qq
--first show first occurrence of each error
--exclude=patterns exclude files or directories which match these comma
separated patterns (default:
.svn,CVS,.bzr,.hg,.git,__pycache__)
--filename=patterns when parsing directories, only check filenames
matching these comma separated patterns (default:
*.py)
--select=errors select errors and warnings (e.g. E, --ignore=errors skip errors and warnings (e.g. E4,W)
--show-source show source code for each error
--show-pep8 show text of PEP 8 for each error (implies --first)
--statistics count errors and warnings
--count print total number of errors and warnings to standard
error and set exit code to 1 if total is not null
--max-line-length=n set maximum allowed line length (default: 79)
--hang-closing hang closing bracket instead of matching indentation
of opening bracket's line
--format=format set the error format [default|pylint|<custom>]
--diff report only lines changed according to the unified
diff received on STDIN
--exit-zero exit with code 0 even if there are errors
--builtins=BUILTINS define more built-ins, comma separated
--max-complexity=MAX_COMPLEXITY
McCabe complexity threshold
--install-hook Install the appropriate hook for this repository.
Testing Options:
--benchmark measure processing speed
Configuration:
The project options are read from the [flake8] section of the tox.ini
file or the setup.cfg file located in any parent folder of the path(s)
being processed. Allowed options are: exclude, filename, select,
ignore, max-line-length, hang-closing, count, format, quiet, show-
pep8, show-source, statistics, verbose, builtins, max-complexity.
--config=path user config file location (default:
/Users/yuhei/.config/flake8)手元にあったdjangoプロジェクトに対して実行してみる
flake8 . --filename="*.py" --exclude=migrations --statistics ./app/models.py:1:1: F401 'models' imported but unused ./decision_table/settings.py:7:80: E501 line too long (82 > 79 characters) ./decision_table/settings.py:79:1: E122 continuation line missing indentation or outdented ./decision_table/settings.py:89:1: E122 continuation line missing indentation or outdented ./decision_table/urls.py:9:5: E128 continuation line under-indented for visual indent ./decision_table/urls.py:26:55: W292 no newline at end of file ./decision_table/settings/__init__.py:1:1: W391 blank line at end of file 2 E122 continuation line missing indentation or outdented 1 E128 continuation line under-indented for visual indent 1 E501 line too long (82 > 79 characters) 1 F401 'models' imported but unused 1 W292 no newline at end of file 1 W391 blank line at end of file
southを使っている場合はmigrations以下のファイルがE501に引っかかるのでexcludeにしたほうがいいと思う
statisticオプションを指定すると、それぞれのエラーに対する件数が最後に表示される
djangoに対して実行してみる
1行79文字までが結構いっぱいひっかかるので、--max-line-length=120を指定
$ flake8 . --filename="*.py" --statistics --max-line-length=120
...省略...
1 E101 indentation contains mixed spaces and tabs
23 E111 indentation is not a multiple of four
65 E121 continuation line indentation is not a multiple of four
15 E122 continuation line missing indentation or outdented
42 E124 closing bracket does not match visual indentation
56 E125 continuation line does not distinguish itself from next logical line
138 E126 continuation line over-indented for hanging indent
113 E127 continuation line over-indented for visual indent
1078 E128 continuation line under-indented for visual indent
75 E201 whitespace after '{'
63 E202 whitespace before '}'
559 E203 whitespace before ','
111 E221 multiple spaces before operator
14 E222 multiple spaces after operator
36 E225 missing whitespace around operator
7 E227 missing whitespace around bitwise or shift operator
4 E228 missing whitespace around modulo operator
414 E231 missing whitespace after ','
310 E251 unexpected spaces around keyword / parameter equals
364 E261 at least two spaces before inline comment
3 E262 inline comment should start with '# '
2 E271 multiple spaces after keyword
4 E272 multiple spaces before keyword
83 E301 expected 1 blank line, found 0
1718 E302 expected 2 blank lines, found 1
35 E303 too many blank lines (3)
3 E401 multiple imports on one line
328 E501 line too long (121 > 120 characters)
52 E502 the backslash is redundant between brackets
305 E701 multiple statements on one line (colon)
2 E702 multiple statements on one line (semicolon)
2 E703 statement ends with a semicolon
7 E711 comparison to None should be 'if cond is None:'
11 E712 comparison to False should be 'if cond is False:' or 'if not cond:'
2 E721 do not compare types, use 'isinstance()'
434 F401 'models' imported but unused
54 F403 'from django.contrib.auth.tests.custom_user import *' used; unable to detect undefined names
13 F811 redefinition of unused 'ContentType' from line 18
1 F812 list comprehension redefines 'cls' from line 59
17 F821 undefined name 'lookup_field'
66 F841 local variable 'lib' is assigned to but never used
3 F999 syntax error in doctest
1 W191 indentation contains tabs
296 W291 trailing whitespace
7 W292 no newline at end of file
18 W293 blank line contains whitespace
57 W391 blank line at end of file
3 W601 .has_key() is deprecated, use 'in'思ったよりひっかかる