背景
在实际开发过程中,每次我们的代码发生改变后,使用命令或者通过运行IDE中的某个插件的方式来检查代码是比较麻烦的,另外,和你进行合作开发的其他人也有可能用了和你不同的代码检查方式,甚至我们自己有时候也可能没有严格的进行代码检查或者就算有了提示但是你并没有根据提示要求去更正你的代码,导致代码慢慢的变得混乱并且难以理解和阅读,可维护成本变高,一般要想提高项目的可维护性可以使用一些外部库来检查代码的运行状况。
实现
为了能够使开发人员能够快速的了解新项目的具体情况快速上手,并且可以保持项目代码进行良好运行,一个比较好的方式就是在代码提交前强制进行自动化代码规范,下面开始介绍实现代码规范的各个模块和工具的使用。
Typing
变量类型提示模块
作用:
1.用于进行代码检查,防止代码运行时出现
1)函数参数的传入和调用不匹配的问题
2)函数返回值类型不符合预期的问题
2.可以作为开发文档的附加说明
1)方便使用者调用已经存在的函数时准确的了解传入和返回参数的类型,增强代码的可维护性
2)当定义比较复杂的变量时,使用变量类型提示,能够增强代码的可读性
3.加入该模块后不会影响代码的正常运行,也不会报正式的错误,只是起到提醒的作用。
注:typing是python3.5之后才有的模块,目前pycharm是支持其进行代码检查的。
python3.9之后:Python 3.9 有哪些新变化?
Mypy
静态类型检查器,完成带有类型提示的代码之后,用 mypy 命令来检查,会检查出有错误的代码,让类型提示的作用发挥的更加有效。
在没有mypy之前,typing模块只能让代码看起来更加美观,就算参数真的传错了,也并不会影响程序的运行,没有真正起到提示的作用。
安装:
pip3 install mypy
使用:
mypy demo.py
如果想忽略错误提示:
func() # type: ignore
注:mypy也是需要python3.5之后的版本才能运行,虽然需要安装python3才能执行,但是它也能检查python2的代码。
Flake8
检查 Python 代码风格和质量的一个 Python 工具,它将 PEP 8、Pyflakes(类似 Pylint)、McCabe(代码复杂性检查器)和第三方插件整合到一起。
安装:
pip3 install flake8
使用:
flake8 demo.py
注:flake8也是需要python3.5之后的版本才能运行。
Black
python代码格式化工具
python代码需要遵循PEP8规范,是python开发的标配,如果不遵循就会出现黄色波浪线提示。
black是python官方的用来检查代码是否符合PEP8规范的工具,可以格式化整个文件。
安装:
pip3 install black
使用:
black demo.py
注意:black需要python3.6.2之后的版本才能运行
Isort
使import 列表更美观的工具包,它会按照字母顺序对导入的的库进行排序,支持命令行和python代码内部导入两种方式进行导入库的整理。
安装:
pip3 install isort
使用:
isort demo.py
忽略单个import库:
import 模块名 # isort:skip
忽略整个文件:
"""
demo.py
isort:skip_file
"""
注意:isort需要python3.6之后的版本才能运行
pre-commit
git预提交钩子
介绍:用于管理和维护多语言预提交的框架,用于代码git提交commit之前的审查,自动指出代码中存在的问题,如果代码检测出错,则阻止commit代码的提交,从而也没办法push,保证有问题的代码不会被提交到远程仓库中。通过在代码提交前发现问题,这会让我们更专注于代码更改的架构,而不用浪费时间在代码风格的选择。
安装:
pip3 install pre-commit
在项目的根目录下添加预提交配置文件.pre-commit-config.yaml
将自动检查代码纳入到开发工作流程中
black,flake8,mypy,isort等和pre-commit集成使用
编辑.pre-commit-config.yaml
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.1.0
hooks:
- id: check-yaml
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-docstring-first
- id: debug-statements
- id: requirements-txt-fixer
- repo: https://gitlab.com/pycqa/flake8
rev: 4.0.1
hooks:
- id: flake8
additional_dependencies:
- flake8-pytest-style
- flake8-bugbear
- flake8-logging-format
- repo: https://github.com/psf/black
rev: 22.3.0
hooks:
- id: black
- repo: https://github.com/pycqa/isort
rev: 5.10.1
hooks:
- id: isort
- repo: https://github.com/asottile/setup-cfg-fmt
rev: v1.20.0
hooks:
- id: setup-cfg-fmt
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v0.950
hooks:
- id: mypy
additional_dependencies:
- types-all
- sqlalchemy-stubs
使用:
手动运行存储库上的所有预提交挂钩
pre-commit run --all-files
预提交支持多种语言编写的钩子,只要使用的repo(任何可以git clone都可以repo)是可安装的包(gem,npm pypi等)或者公开的可执行文件就可以和pre-commit一起进行使用,预提交配置文件会告诉pre-commit。