前言
今天和大家分享一篇关于python代码风格统一的方法。我自己之前有使用过,但都是使用公司现成的,没有自己动手去实操,所以为了一探究竟,今天专门花了一点时间去研究,这个过程还挺顺利的,这里我将这个过程分享给大家。
我这里主要分享python中的导包规范和内容规范统一的方法,分别使用到的两个工具是isort和autopep8,当然这样的工具有很多,至于为什么选择这两个工具:第一导包工具的格式化我只查到了isort这一个,第二autopep8是根据pep 8这个提议开发的,相对较官方。同时我也会分享如何在git中如何使用这两个工具,让你每次都能提交规范统一的代码,这里主要会用到pre- commit这个工具。
isort
isort的官方介绍:isort is a Python utility / library to sort imports alphabetically, and automatically separated into sections and by type. It provides a command line utility, Python library and plugins for various editors to quickly sort all your imports. It requires Python 3.7+ to run but supports formatting Python 2 code too.
通过官方介绍我们可以知道对我们有用的几点:
- 1.它是按照字母顺序进行排序的,同时也会根据导入的类型(内置库,第三方库,自己的库)来进行分类排序
- 2支持命令行(也能内嵌代码)
- 3.python版本要求3.7+,python2的仅支持格式化(isort既支持导包格式化也支持内容格式化)
排序的规则
根据包的来源不同,我们可以分为内置库,第三方包和自己编写的库,按照导包的风格,我们可以分为from xxx import xxx和import xxx两种风格。因此排序规则为:首先按照包的来源,然后按照导入风格,最后根据报名来进行排序,排序后的代码样子长成下面这个样子:
from __future__ import absolute_import
import os
import sys
from third_party import (lib1, lib2, lib3, lib4, lib5, lib6, lib7, lib8,
lib9, lib10, lib11, lib12, lib13, lib14, lib15)
from my_lib import Object, Object2, Object3
print("Hey")
print("yo")
使用
安装
pip install isort
命令行使用
官方的例子很好,我这里就直接贴出官方的例子来:
autopep8
上面使用isort进行了导包的规范,现在来使用autopep8来进行代码内容的规范。
它好像没有官网,但是有官方的github仓库:传送门。
官方介绍:autopep8 automatically formats Python code to conform to the PEP 8 style guide. It uses the pycodestyle utility to determine what parts of the code needs to be formatted. autopep8 is capable of fixing most of the formatting issues that can be reported by pycodestyle.
通过官方文档的介绍我们可以知道信息是:autoepep8主要实现了将代码格式转成pep8的格式。它借助了pycodestyle来检查哪些需要转化,然后它自己再去执行这些转化。具体的pep8规范大家可以参考上面的链接。
使用
安装
pip install autopep8
命令行使用
它的使用也和isort一样方便:
autopep8 filename
它的配置项有如下这些:
其中有一个需要提到的配置就是这个–max-line-length n,它是用来限制每一行代码的最大长度的,默认是79个字符的长度,也就是超过了79个字符就不满足它的要求,会进行格式化。但是实际上我个人觉得79有点太短了,格式化之后反而会看着不舒服,不知道大家会不会有这个感觉。
git提交时自动格式化
isort和autopep8都支持命令行和代码内(很少这样使用)实现,上面主要分享了命令行内的使用方法,但是它也支持在git commit时自动格式化,这样就不需要我们每次写完代码再命令行输入命令进行格式化了。这里需要使用到另外一个工具,它就是:pre-commit,官方文档介绍如下:
其中红框是我认为比较重要的点:
- 1.它会在每次commit的时候运行一些hooks(这里的hooks可以理解成上面的小工具)
- 2.它的目的是让我们专注在内容上,而不是样式(提升效率)
使用
安装
pip install pre-commit
配置
配置的步骤主要有两点:
- 1.在项目的根目录下新建一个yaml文件,文件名为:
.pre-commit-config.yaml
- 2.配置内容,格式如下所示。如果复制粘贴嫌太麻烦的话可以使用
pre-commit sample-config > .pre-commit-config.yaml
命令,它会生成一个样本配置到指定的文件。
知道了如上的配置规则后,配置isort和autopep8就容易很多了!一般官网也会给出相应的配置,isort的配置如下(参考链接):
(这里有一点需要注意的是:官方链接给出的样例中版本指定的是5.11.2
,但是这个可能会有问题,指定更高的版本就可以了。)
- repo: https://github.com/pycqa/isort
rev: 5.12.0
hooks:
- id: isort
name: isort (python)
autopep8的配置与isort类似,如下:
- repo: https://github.com/hhatto/autopep8
rev: 2.0.4 # select the tag or revision you want, or run `pre-commit autoupdate`
hooks:
- id: autopep8
需要注意的是,通过pre-commit来运行这两个hook时,既可以在.pre-commit-config.yaml
文件中指定参数,也可以在各自的配置文件中指定参数,各自的配置可以参考官方网站,我这里分享一下autopep8的配置,autopep8在运行时会默认读取全局配置,同时也会读取local的配置(如果local指定了的话)
我这里在local指定一下配置文件:
通过这样指定后,你在命令行运行autopep8时就不需要再额外指定配置了,它会默认读取这个配置文件。配置完成之后,我最后的.pre-commit-config.yaml
文件是下面这个样:
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
# isort的配置
- repo: https://github.com/pycqa/isort
rev: 5.13.2
hooks:
- id: isort
name: isort (python)
# autopep8的配置
- repo: https://github.com/hhatto/autopep8
rev: v2.0.4 # select the tag or revision you want, or run `pre-commit autoupdate`
hooks:
- id: autopep8
args: ["."]
安装git hook scripts
上面的配置算是完成了所有的准备工作,但是如何在commit时自动运行这两个hook,还需要最后一个步骤,那就是安装git hook scripts,这个步骤也非常简单,需要执行的命令如下:
pre-commit install
执行完这个命令后,你每次git commit时就会执行上面的两个hook啦!如果在commit时发现你的代码不符合规范,它会自动给你修改,这个时候你需要重新add并commit才能提交到远程仓库。
总结
这篇文章主要围绕代码规范统一,介绍了两个工具的使用方式,分别是isort和autopep8,他们都是针对python代码风格统一的工具,其中isort能够规范导包的风格,autopep8能够规范代码内容的风格,他们各自都支持命令行和内嵌代码来执行,最后介绍到了pre-commit这个工具,它能够将前面两个小工具“挂载”到git上,使得每次执行git commit命令的时候都自动去执行格式化。还等什么,快去规范一下你的代码风格吧!👻
更多内容可以关注博主的个人博客系统:《Python源码剖析》之对象的基石—PyObject