使用isort和autopep8统一代码风格

前言

今天和大家分享一篇关于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 xxximport 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
命令行使用

官方的例子很好,我这里就直接贴出官方的例子来:

image.9814d010bced11ee9de617490ed73bd0.png

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

它的配置项有如下这些:
image.a3792c0ebcf111ee9de617490ed73bd0.png
其中有一个需要提到的配置就是这个–max-line-length n,它是用来限制每一行代码的最大长度的,默认是79个字符的长度,也就是超过了79个字符就不满足它的要求,会进行格式化。但是实际上我个人觉得79有点太短了,格式化之后反而会看着不舒服,不知道大家会不会有这个感觉。

git提交时自动格式化

isort和autopep8都支持命令行和代码内(很少这样使用)实现,上面主要分享了命令行内的使用方法,但是它也支持在git commit时自动格式化,这样就不需要我们每次写完代码再命令行输入命令进行格式化了。这里需要使用到另外一个工具,它就是:pre-commit,官方文档介绍如下:
image.3f38e060bcf411ee9de617490ed73bd0.png
其中红框是我认为比较重要的点:

  • 1.它会在每次commit的时候运行一些hooks(这里的hooks可以理解成上面的小工具)
  • 2.它的目的是让我们专注在内容上,而不是样式(提升效率)

使用

安装
pip install pre-commit
配置

配置的步骤主要有两点:

  1. 1.在项目的根目录下新建一个yaml文件,文件名为:.pre-commit-config.yaml
  2. 2.配置内容,格式如下所示。如果复制粘贴嫌太麻烦的话可以使用pre-commit sample-config > .pre-commit-config.yaml命令,它会生成一个样本配置到指定的文件。

image.e80bc272bd9711ee9de617490ed73bd0.png

知道了如上的配置规则后,配置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指定了的话)
image.fc2a10d0bd9f11ee9de617490ed73bd0.png
我这里在local指定一下配置文件:
image.031f4ca0bda211ee9de617490ed73bd0.png

通过这样指定后,你在命令行运行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

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
flake8、black和isort是三个不同的Python代码质量检查工具,可以通过组合使用来提高代码质量。 - flake8可以检查代码是否符合PEP 8规范,包括变量命名、代码缩进、代码注释等方面。 - black可以自动对Python代码进行格式化,使得代码风格统一,易于阅读。 - isort可以自动对Python代码进行导入排序,遵循PEP 8规范,使得导入语句更加清晰、易于管理。 把这三个工具结合起来使用,可以极大地提高代码质量,并且可以通过配置文件来定制自己的检查规则和检查方式。 步骤如下: 1. 安装三个工具: ``` pip install flake8 black isort ``` 2. 创建配置文件: 在项目根目录下创建以下文件: - .flake8:flake8配置文件 - pyproject.toml:black和isort配置文件 .flake8文件内容: ``` [flake8] max-line-length = 88 exclude = .git,__pycache__,build,dist extend-ignore = E203 ``` pyproject.toml文件内容: ``` [tool.black] line-length = 88 target-version = ['py39', 'py38', 'py37', 'py36'] exclude = '''/( \.git | \.hg | \.mypy_cache | \.pytest_cache | \.tox | \.venv | _build | buck-out | build | dist )/''' [tool.isort] line_length = 88 multi_line_output = 3 include_trailing_comma = true force_grid_wrap = 0 use_parentheses = true ensure_newline_before_comments = true skip_glob = "**/node_modules/**" ``` 3. 运行检查: 进入要检查的Python项目目录下,运行以下命令: ``` flake8 . # 检查代码规范 black . # 格式代码 isort . # 导入语句排序 ``` 4. 自动化检查: 可以使用pre-commit工具来自动化代码检查,每次提交代码时自动运行以上三个命令进行检查和格式化,避免不规范的代码进入代码仓库,提高代码质量。需要在项目根目录下创建pre-commit配置文件: ``` repos: - repo: https://github.com/psf/black rev: 21.8b0 hooks: - id: black language_version: python3.9 - repo: https://github.com/PyCQA/flake8 rev: 3.9.2 hooks: - id: flake8 - repo: https://github.com/pycqa/isort rev: 5.9.1 hooks: - id: isort ``` 安装pre-commit: ``` pip install pre-commit ``` 安装完毕后,在项目根目录下运行以下命令进行初始化: ``` pre-commit install ``` 每次提交代码时,pre-commit会自动运行以上三个命令进行检查和格式化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值