可读性很重要。
— Python 之禅,Tim Peters
当软件项目进入“维护模式”时,很容易忽略可读性和编码标准。(而且,一开始就从未建立这些标准也很容易。)但是,在整个代码库中保持一致的风格和测试标准是减轻维护负担的重要组成部分,确保未来的开发人员能够快速理解新项目中的内容,并长期保障应用程序的健康。
保护项目未来可维护性的一个好方法是使用外部库来检查您的代码健康状况。以下是我们最喜欢的一些库,用于代码检查(检查 PEP 8 和其他样式错误)、强制执行一致的样式以及确保项目成熟时可接受的测试覆盖率。
检查您的代码风格
PEP 8 是 Python 代码风格指南,它规定了诸如行长、缩进、多行表达式和命名约定等规则。您的团队可能也有自己的风格规则,这些规则与 PEP 8 略有不同。任何代码风格指南的目标都是在整个代码库中强制执行一致的标准,使其更具可读性,从而更易于维护。以下是三个可以帮助美化您的代码的库。
1. Pylint
Pylint 是一个用于检查 PEP 8 样式违规和常见错误的库。它与几个流行的编辑器和 IDE 良好集成,也可以从命令行运行。
要安装,请运行 pip install pylint
。
要从命令行使用 Pylint,请运行 pylint [options] path/to/dir
或 pylint [options] path/to/module.py
。Pylint 将在控制台中输出有关样式违规和其他错误的警告。
您可以使用名为 pylintrc
的配置文件自定义 Pylint 检查的错误。
2. Flake8
Flake8 是一个“Python 工具,它将 PEP8、Pyflakes(类似于 Pylint)、McCabe(代码复杂度检查器)和第三方插件粘合在一起,以检查某些 Python 代码的样式和质量。”
要使用 Flake8,请运行 pip install flake8
。然后运行 flake8 [options] path/to/dir
或 flake8 [options] path/to/module.py
以查看其错误和警告。
与 Pylint 类似,Flake8 允许使用配置文件对其检查的内容进行一些自定义。它有非常清晰的文档,包括一些关于有用的提交钩子的文档,以在您的开发工作流程中自动检查您的代码。
Flake8 与流行的编辑器和 IDE 集成,但这些说明通常在文档中找不到。要将 Flake8 与您最喜欢的编辑器或 IDE 集成,请在线搜索插件(例如,Sublime Text 的 Flake8 插件)。
3. Isort
Isort 是一个库,它可以按字母顺序对您的导入进行排序,并将它们分解为适当的部分(例如,标准库导入、第三方库导入、来自您自己项目的导入等)。这提高了可读性,并使您更容易找到模块中大量的导入。
使用 pip install isort
安装 isort,并使用 isort path/to/module.py
运行它。更多配置选项在文档中。例如,您可以配置 isort 如何在 .isort.cfg
文件中处理来自一个库的多行导入。
与 Flake8 和 Pylint 类似,isort 也提供了将其与流行的编辑器和 IDE 集成的插件。
外包您的代码风格
记住对您更改的每个文件从命令行手动运行 linter 很麻烦,您可能不喜欢某个特定插件在您的 IDE 中的行为方式。此外,您的同事可能更喜欢不同的 linter,或者可能没有他们喜欢的编辑器的插件,或者您可能不太注意总是运行 linter 并纠正警告。随着时间的推移,您共享的代码库将变得混乱且难以阅读。
一个很好的解决方案是使用一个库,它可以自动将您的代码重新格式化为符合 PEP 8 的代码。我们推荐的这三个库都具有不同的自定义级别和不同的默认代码格式化方式。其中一些比其他库更武断,因此与 Pylint 和 Flake8 一样,您需要测试这些库,看看哪个库提供了您离不开的自定义……以及您可以接受的不可更改的默认值。
4. Autopep8
Autopep8 自动格式化您指定的模块中的代码。它将重新缩进行、修复缩进、删除多余的空格,并重构常见的比较错误(例如布尔值和 None
)。请参阅文档中的完整更正列表。
要安装,请运行 pip install --upgrade autopep8
。要就地重新格式化代码,请运行 autopep8 --in-place --aggressive --aggressive <filename>
。aggressive
标志(及其数量)指示您希望 autopep8 对您的代码风格施加多少控制。阅读有关激进选项的更多信息。
5. Yapf
Yapf 是另一个用于重新格式化代码的选项,它带有自己的配置选项列表。它与 autopep8 的不同之处在于,它不仅仅解决 PEP 8 违规问题。它还会重新格式化那些不违反 PEP 8 但风格不一致或可以格式化得更好以提高可读性的代码。
要安装,请运行 pip install yapf
。要重新格式化代码,请运行 yapf [options] path/to/dir
或 yapf [options] path/to/module.py
。还有完整的自定义选项列表。
6. Black
Black 是用于就地重新格式化代码的 linters 中的新秀。它类似于 autopep8 和 Yapf,但更加武断。它的自定义选项非常少,这正是重点。其理念是您不应该对代码风格做出决定;唯一要做的决定是让 Black 为您决定。您可以阅读有关有限的自定义选项以及有关将其存储在配置文件中的说明。
Black 需要 Python 3.6+,但可以格式化 Python 2 代码。要使用,请运行 pip install black
。要美化您的代码,请运行:black path/to/dir
或 black path/to/module.py
。
检查您的测试覆盖率
您正在编写测试,对吗?然后,您需要确保提交到代码库的新代码经过测试,并且不会降低您的总体测试覆盖率。虽然测试覆盖率百分比不是您应该用来衡量测试有效性和充分性的唯一指标,但它是确保在您的项目中遵循基本测试标准的一种方法。对于衡量测试覆盖率,我们有一个建议:Coverage。
7. Coverage
Coverage 有多种选项用于向您报告测试覆盖率,包括将结果输出到控制台或 HTML 页面,并指示哪些行号缺少测试覆盖率。您可以设置一个配置文件来定制 Coverage 检查的内容并使其更易于运行。
要安装,请运行 pip install coverage
。要运行程序并查看其输出,请运行 coverage run [path/to/module.py] [args]
,您将看到程序的输出。要查看缺少覆盖率的代码行报告,请运行 coverage report -m
。
持续集成工具
持续集成 (CI) 是一系列您可以运行的流程,用于在合并和部署代码之前自动检查 linter 错误和最低测试覆盖率。有许多免费或付费工具可以自动化此过程,而全面的演练超出了本文的范围。但是,由于设置 CI 流程是消除阻碍代码更具可读性和可维护性的重要一步,因此您应该总体上研究持续集成工具;特别是查看 Travis CI 和 Jenkins。
这些只是可用于检查您的 Python 代码的众多库中的一小部分。如果您有不在列表中的收藏夹,请在评论中分享。
2 条评论