使用pre-commit flake8来规范项目的pep8

pre-commit的规范

正如pre-commit的字面意思, 他的功能就是在commit之前做一些检测.  大多数是用来检测代码的规范,当然你可以加各种奇葩的需求,当你git commit的时候git会自动调用该脚本. 

说来有意思,我见过的python程序员,要不很规范,要不很洒脱。 我是属于那种写脚本很洒脱随意,写项目比较规范的一类人。 用ide的人还好一点,尤其是那种用vim和emas的python工程师(没有配置flake8) , 这代码真是没法看呀… 哥们我真是受够了,  大家每次写那种有前端页面的项目时,代码出奇的规范(为啥?   因为前端的ide),每当写底层服务时候,也还行,但很多时候一个人负责一个单独的项目,这时候代码的规范就不好保证了…   

这么多人一起开发,每个人都有自己所谓的规范,谁都不服谁,我个人也觉得pep8的标准有些地方不尽人意,比如文档说明,orm的命名规范,测试模块,所以我们有自己的pep8加强版.  配合pre-commit能很方便的检测规范我们自定义的标准. 

该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新.   http://xiaorui.cc/?p=3829

怎么用pre-commit来检查代码?

pre-commit的步骤还是比较简单的,主要是下面这几步.

第一步

把上面配置写项目根目录下的 .pre-commit-config.yaml 文件里.

下面是我自个用的pre-commit配置, repo地址是pre-commit-hooks的地址,你也可以fork一个版本自己做一些调整,但一般来说官方提供的库包已经足够了.

#xiaorui.cc


-   repo: git://github.com/pre-commit/pre-commit-hooks
    sha: 97b88d9610bcc03982ddac33caba98bb2b751f5f
    hooks:
    -   id: fix-encoding-pragma
    -   id: autopep8-wrapper
        args:
        - --in-place
        - --ignore=E501,E228,E226,E261,E266,E128,E402,E241
    -   id: check-added-large-files
    -   id: check-ast
    -   id: check-case-conflict
    -   id: check-docstring-first
    -   id: check-json
    -   id: pretty-format-json
    -   id: check-merge-conflict
    -   id: check-xml
    -   id: check-yaml
    -   id: debug-statements
    -   id: detect-private-key
    -   id: flake8
        args:
        - --ignore=E501,E228,E226,E261,E266,E128,E402,W503
        - --builtins=G,request
        - --jobs=1
    -   id: end-of-file-fixer
    -   id: requirements-txt-fixer
    -   id: trailing-whitespace

第二步,  安装pre-commit 

# xiaorui.cc

pip install pre-commit
pre-commit install

第三步, 提交代码来检测pep8代码规范.

git commit -m “init project path”    

git commit的时候会调用pre-commit,pre-commit又会调用flake8校验你的代码是否符合python pep8的标准.  另外pre-commit也带了自修复的功能.  但是这个修复是那种特明显的 .

我们可以在本地来测试代码pep8规范, 也就是说 不用非要git commit动作才开始检测.

flake8  .  # 本地文件
pre-commit  run  flake8


单纯的flake8配置可以写在 ~/.config/flake8 , 也可以直接按照参数来运行检测.

# xiaorui.cc

flake8 --ignore D203 \
         --exclude .git,__pycache__,docs/source/conf.py,old,build,dist \
         --max-complexity 10

vim   ~/.config/flake8

[flake8]
ignore = D203
exclude =
    .git,
    __pycache__,
    docs/source/conf.py,
    old,
    build,
    dist
max-complexity = 10

注意:

关于的pre-commit配置直接可以采用pre-commit-hooks的repo地址,你也可以fork一个版本自己做一些调整,比如更贴合公司内部的规范,但一般来说官方提供的库包已经足够了。


下面是flake8的详细参数说明, 有兴趣的朋友可以看官网, http://flake8.pycqa.org/en/latest/faq.html:

# xiaorui.cc

- exclude : 排除的文件或者目录,使用逗号分割,可以是直接文件名,也可以是正则匹配的文件名,默认:default: .svn,CVS,.bzr,.hg,.git,__pycache
- filename : 要进行检测的文件,使用逗号分割,可以是直接文件名,也可以是正则匹配的文件名,默认:*.py
- select : 默认使用的错误和警告,默认关闭
- ignore : 如果你觉得flake8太严苛了,可以适当的调整下忽略下.,如果不设置,默认:E123/E133, E226 and E241/E242
- max-line-length : 一行最大的字符长度,默认:79
- format : 错误的显示格式
- max-complexity=12 : 复杂度因子, 我一般配置12 .

如果你跟我一样很好奇git pre-commit怎么联动起来的 ?  我们可以看下当前项目.git/hoos/pre-commit文件. 是用shell写得一个小脚本,但里面的检查是python相关的.  最后通过exit值来判断是否允许commit.

# Run pre-commit
if ((WHICH_RETV == 0)); then
    pre-commit $args
    PRE_COMMIT_RETV=$?
elif ((ENV_PYTHON_RETV == 0)); then
    "$ENV_PYTHON" -m pre_commit.main $args
    PRE_COMMIT_RETV=$?
else
    python -m pre_commit.main $args
    PRE_COMMIT_RETV=$?
fi

if ((PRE_COMMIT_RETV != 0)); then
    retv=1
fi

exit $retv

其实我们也可以自己写一个 .git/hoos/pre-commit. 

#!/usr/bin/python

import sys
from flake8.run import git_hook

COMPLEXITY = 12
STRICT = True

if __name__ == '__main__':
    sys.exit(git_hook(complexity=COMPLEXITY, strict=STRICT))

顺便说下 vim flake8的结合:

如果你有vundle vim包管理器,那么直接贴这个配置就可以了.

" Flake8 plugin for Vim.
Bundle 'nvie/vim-flake8'
" compiler plugin for python style checking tool.
Bundle 'vim-scripts/pylint.vim'
autocmd FileType python compiler pylint

END>


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

发表评论

电子邮件地址不会被公开。 必填项已用*标注