機器和人各有所長,如coding style檢查這樣的可本身主動化的工做理應交給機器去完畢,故發此文幫助你在幾分鐘內實現coding style的本身主動檢查。html
https://www.python.org/dev/peps/pep-0008/python
發明Python語言豐碑人物Guido van Rossum的親自寫的Coding Style, 知名度5顆星,可操做性5顆星。git
http://google-styleguide.googlecode.com/svn/trunk/pyguide.htmlgithub
Google內部普遍使用Python做爲開發語言,此Coding Style 在坊間流傳很是廣。知名度5顆星,可操做性5顆星。web
值得一提的是Guido也之前在Google工做過一段時間。api
本身主動化
的利器你可能據說過pep8。這是一個依據PEP8
規範檢查python代碼style的本身主動化工具。ruby
flake8
是對pep8
進行了包裝,充分發揮了插件化的優點。添加了如代碼複雜度,函數、變量命名習慣,import順序等檢查。markdown
安裝flake8。同一時候安裝一些實用的插件。ide
https://github.com/PyCQA/pep8-naming
命名檢查svn
https://github.com/public/flake8-import-order
import 順序檢查。可以有兩種風格順序檢查cryptography, google。如google
的意思是import順序是(1)標準庫(2)第三方庫(3)本地項目庫。代碼檢查時可以經過--import-order-style=google
來指定。
https://github.com/schlamar/flake8-todo
檢查代碼中的todo。
https://github.com/zheller/flake8-quotes/
檢查單雙引號的使用是否正確。
詳細安裝命令例如如下:
$ pip install flake8
$ pip install pep8-naming
$ pip install flake8-import-order
$ pip install flake8-todo
$ pip install flake8-quotes
檢查安裝了哪些插件:
$ flake8 --version
# 輸出例如如下內容,顯示了已安裝的插件:
2.5.1 (pep8: 1.5.7, import-order: 0.6.1, naming: 0.3.3, pyflakes: 1.0.0, mccabe: 0.3.1, flake8-todo: 0.4, flake8_quotes: 0.1.1) CPython 2.6.6 on Linux
好比例如如下代碼:
# test.py
from order import place_order
import os, sys
class website_api(object):
def __init__(self):
self.user_name = ''
self.Gender = 'male'
#comment in wrong ident
self.active =False
def login(self, Person):
self.user_name=Person.user_name
not_used_var = 0
return True
def Logout(self):
self.active =False
def place_order(self):
place_order()
def action():
Client_a = website_api()
Client_a.login()
Client_a.place_order()
Client_a.Logout()
運行檢查命令:
$ flake8 --first --import-order-style=google test.py
輸出結果例如如下,你可以依據錯誤碼來修正代碼,如當中的N802
的意思是function name不該該包括大寫英文字母。
# flake8 output
test.py:2:1: F401 'sys' imported but unused
test.py:2:1: I100 Imports statements are in the wrong order. from os, sys should be before from order
test.py:2:1: I201 Missing newline before sections or imports.
test.py:2:10: E401 multiple imports on one line
test.py:4:7: N801 class names should use CapWords convention
test.py:8:9: E265 block comment should start with '# '
test.py:9:22: E225 missing whitespace around operator
test.py:11:9: N803 argument name should be lowercase
test.py:13:9: F841 local variable 'not_used_var' is assigned to but never used
test.py:16:9: N802 function name should be lowercase
test.py:23:5: N806 variable in function should be lowercase
除此以外。flake8也可以遞歸得檢查某個文件夾中的代碼:
$ flake8 your_project_dir
flake8常常使用的options有:
show source code for each error
show first occurrence of each error
import order style to follow
print total number of errors and warnings to standard error and set exit code to 1 if total is not null
get help
Codes | Notes | Link |
---|---|---|
E***/W*** | pep8 errors and warnings | http://pep8.readthedocs.org/en/latest/intro.html#error-codes |
F*** | PyFlakes codes (see below) | https://flake8.readthedocs.org/en/latest/warnings.html |
C9** | McCabe complexity, 眼下僅僅有C901 | https://github.com/PyCQA/mccabe |
N8** | PEP-8 naming conventions | https://github.com/PyCQA/pep8-naming#plugin-for-flake8 |
I*** | checks the ordering of your imports | https://github.com/public/flake8-import-order#warnings |
T*** | 眼下僅僅有T000檢查代碼中是否包括TODO, FIXME | https://github.com/schlamar/flake8-todo |
Q*** | 眼下有Q000表明單雙引號使用錯誤 | https://github.com/zheller/flake8-quotes/ |
隨着新的flake8 plugin的集成,還可能有其它的codes,假設你的項目有特殊的代碼檢查需求。也可開發本身的plugin。
依據需要,flake8的配置可以是全局的(對所有project有效)。也可以是分project的。這裏僅舉例說明全局配置方法。分project配置請見flake8 Per Project Configuration。
編輯 ~/.config/flake8
[flake8]
ignore = E201,E202,E302
exclude = .tox,*.egg
max-line-length = 120
以上配置的意思是flake8不檢查E201, E202, E302這三個錯誤,不檢查.tox,*.egg文件。贊成的最長單行代碼長度爲120個字符。
flake8可結合Git實現commit
時檢查coding style的目的,假設flake8報錯,則沒法commit
。
在python project的根文件夾下運行例如如下命令安裝git pre-commit hook。
$ flake8 --install-hook
$ git config flake8.strict true
Google Python Coding Style
http://google-styleguide.googlecode.com/svn/trunk/pyguide.html
Warning / Error codes of flake8
https://flake8.readthedocs.org/en/latest/warnings.html