七套Python库快速提升您项目的代码可维护性

feishicheng 2018-09-13


检查Python代码的健康状况,并利用以下外部库提升其可维护水平。

七套Python库快速提升您项目的代码可维护性

当软件项目进入“维护模式”时,原本的代码可读性与编码标准往往很难得到保证。(当然,这些标准在软件项目建立之初就不容易坚持实施。)但必须强调的是,在代码库中保持样式与测试标准的一致性,正是降低维护负担的重要前提。只有这样,我们才能确保未来的开发人员得以快速了解新的情况,并随着时间推移切实保证项目与应用程序的健康状况。

保护项目未来可维护性的一种理想方式,在于利用外部库检查您的代码运行状况。以下是目前开发人员最喜爱的的代码梳理库,它们能够以强制方式执行一致性样式,并确保项目在成熟之后仍具备可接受的测试覆盖率。

检查您的代码样式

PEP 8是一套Python代码样式指南,其为行长度、缩进、多行表达式以及命名约定等内容提供重要的执行规则。当然,您的团队也许拥有自己的样式规则,且其与PEP 8略有不同。

凭借代码样式指南都拥有同样的目标——在代码库中强制实施一致的标准,从而使其更具可读性并降低维护难度。在这方面,以下三套库能够帮助大家高效改善代码质量。

1. Pylint

Pylint 是一套用于检查PEP 8样式违规与常见错误的库。它能够与多种高人气编辑器及IDE良好集成,亦可通过命令行加以运行。

您可以运行pip install pylint命令以进行安装。

要通过命令行使用Pylint,您需要运行 pylint [options] path/to/dir or pylint [options] path/to/module.py。Pylint将向控制台输出关于样式违规以及其他错误警告。

大家也可以利用 pylintrc配置文件自定义Pylint的错误检查。

2. Flake8

Flake8是一款“Python工具,可将PEP 8、Pyflakes(类似于Pylint)、McCabe(代码复杂性检查器)以及其他第三方插件加以结合,用以检查Python代码中的样式与质量。”

要使用Flake8,您需要运行 pip install flake8。而后,运行flake8 [options] path/to/dir or flake8 [options] path/to/module.py 查看相关错误与警告信息。

与Pylint类似,Flake8也允许用户对配置文件的检查内容进行自定义,其中包含非常清晰的文档,例如一些实用的commit hook,用以自动检查开发流程中的代码片段。

Flake8能够集成各类流行编辑器与IDE,但文档当中通常并未提及相关指令。要将Flake8与您喜爱的编辑器或IDE进行集成,请在线搜索相关插件(例如 Flake8 plugin for Sublime Text)。

3. Isort

Isort是一套库,能够按字母顺序对您的导入内容进行排序并将其拆分为适当部分(例如标准库导入、第三方库导入、来自您自有项目的导入等)。这将提升代码可读性并在模块中包含大量导入内容时降低查找难度。

要安装isort,您需要运行 pip install isort,而后使用 isort path/to/module.py命令加以运行。关于更多配置选项,请参阅 说明文档。例如,您可以通过isort.cfg文件配置isort如何处理来自某套库的多行导入代码。

与Falke8及Pylint一样,isort同时提供多款插件以集成各类流行编辑器及IDE。

代码样式外包

需要强调的是,在命令行中手动为需要变更的各个文件进行代码梳理是一项痛苦的工作,大家也可能并不喜欢特定插件在IDE中的运行方式。

此外,您的同事可能更倾向于利用不同的插件或者干脆不配合任何插件使用自己喜爱的编辑器; 或者您自己可能不想投入太多心力进行代码梳理并根据警告内容做出调整。随着时间的推移,这一切都可能令您的共享代码库变得混乱且难以阅读。

在这方面,一大理想解决方案是利用库自动对代码进行重新格式化,从而直接为您传递PEP 8内容。这里我们推荐的三套库都拥有不同级别的自定义能力,亦会以不同的默认方式进行代码格式化。

这些默认方式各有优劣,因此大家可能需要像使用Pylint以及Flake8那样对其进行测试,看看哪些能够提供最有效的自定义选项,又有哪些不可更改的默认值比较符合您的要求。

4. Autopep8

Autopep8 能够自动对您指定的模块内的代码进行格式化。它会进行重新缩进、修复缩进、删除不必要的空格,同时重构常见的比较错误(例如布尔值与None)。感兴趣的朋友可以点击此处查看其文档中的完整更正列表。

要安装Autopep8,您需要运行pip install --upgrade autopep8。要对代码进行重新格式化,需要运行autopep8 --in-place --aggressive --aggressive <filename>。其中的aggressive标记(及其数量)表示您希望在代码样式上为autopep8提供多少控制权空间。您可以点击此处了解关于aggressive选项的更多细节信息。

5. Yapf

Yapf 是另一种代码重新格式化选项,其提供自己的配置选项列表。与autopep8不同,yapf不仅能够解决PEP 8违规问题,同时亦会重新格式化那些并不违反特定PEP 8规则的代码——包括不符合样式一致性或者存在其他可读性问题的部分,从而进一步提升代码可维护性。

要安装yapf,您需要运行 pip install yapf。要对代码进行重新格式化,需要运行 yapf [options] path/to/dir 或者yapf [options] path/to/module.py。您可以点击此处查看自定义选项的完整列表。

6. Black

Black在代码重新格式化领域可谓后起之秀。它与autopep8以及Yapf颇为相似,但又有着自己的特点。重点在于,Black提供的自定义选项非常有限。换言之,其基本思路是用户不应对代码样式做出决定,而应将决定权交给Black。当然,大家也可以查看有限的自定义选项,并将其存储在配置文件当中。

Black要求配合Python 3.6+使用,但亦可对Python 2代码进行格式化。要使用Black,您需要运行 pip install black。要对代码进行格式化,您需要运行: black path/to/dir 或者 black path/to/module.py。

检查测试覆盖率

在编写测试的过程中,大家需要确保其能够对代码库中的新代码进行测试,同时不致降低您的测试覆盖率。尽管测试覆盖率百分比并非衡量测试有效性与充分性的惟一指标,但其无疑是确保项目遵循基本测试标准的重要方法之一。为了衡量测试覆盖率,我们向您推荐Coverage。

7. Coverage

Coverage拥有多个选项,可用于向您报告测试覆盖率,具体包括将结果输出至控制台或HTML页面,并指示哪些行号存在测试覆盖缺失。您可以设置配置文件以自定义Coverage的检查内容,并降低其运行难度。

要安装Coverage,您需要运行pip install coverage。要运行程序并查看其输出结果,需要运行 coverage run [path/to/module.py] [args],而后查看程序的输出结果即可。要获取哪些代码行未被测试覆盖,需要运行 coverage report -m。

持续集成工具

持续集成(简称CI)是您可以运行的一系列流程,用于在代码合并与部署之前自动检查梳理错误并给出测试覆盖率的最小值。目前有多种免费或付费工具能够自动完成上述目标,这里我们就不一一赘述了。不过考虑到持续集成是实现代码可读性与可维护性的重要环节,这里向大家推荐两种一般性持续集成工具:Travis CI 与 Jenkins。

相关推荐