Pylint:让你的 Python 代码保持一致

当你想要避免关于代码复杂性的争论时,Pylint 是你的朋友。
481 位读者喜欢这篇文章。
OpenStack source code (Python) in VIM

Alex Sanchez。CC BY-SA 4.0。

Pylint 是一个高级的 Python 风格检查器。虽然 flake8black 会处理“局部”风格:换行符的位置,注释的格式,或者查找注释掉的代码或日志格式中的不良做法等问题。

默认情况下,Pylint 非常激进。它会对所有事情提供强烈的意见,从检查声明的接口是否实际实现,到重构重复代码的机会,这对于新用户来说可能很多。将它温和地引入项目或团队的一种方法是,首先关闭所有检查器,然后逐个启用检查器。如果您已经使用 flake8、black 和 mypy,这将特别有用:Pylint 有很多功能重叠的检查器。

然而,Pylint 独有的功能之一是能够强制执行更高级别的问题:例如,函数中的行数或类中的方法数。

这些数字可能因项目而异,并且可能取决于开发团队的偏好。但是,一旦团队就参数达成一致,使用自动化工具强制执行这些参数将非常有用。这就是 Pylint 的优势所在。

配置 Pylint

为了以空配置开始,请使用以下内容启动您的 .pylintrc

[MESSAGES CONTROL]

disable=all

这会禁用所有 Pylint 消息。由于其中许多消息是冗余的,因此这样做是有意义的。在 Pylint 中,message 是一种特定类型的警告。

您可以通过运行 pylint 来检查是否已关闭所有消息

$ pylint <my package>

通常,将参数添加到 pylint 命令行不是一个好主意:配置 pylint 的最佳位置是 .pylintrc。为了让它做一些有用的事情,我们需要启用一些消息。

为了启用消息,请在 .pylintrc[MESSAGES CONTROL] 下添加。

enable=<message>,

       ...

对于“消息”(Pylint 称之为不同类型的警告)来说,看起来很有用。我的一些最爱包括 too-many-linestoo-many-argumentstoo-many-branches。所有这些都限制了模块或函数的复杂性,并提供客观的检查,而无需人工挑剔者来衡量代码复杂性。

检查器消息的来源:每个消息都属于一个检查器。许多最有用的消息都在 design checker 下。默认数字通常很好,但调整最大值很简单:我们可以在 .pylintrc 中添加一个名为 DESIGN 的部分。

[DESIGN]

max-args=7

max-locals=15

另一个有用的消息来源是 refactoring 检查器。我最喜欢启用的一些消息是 consider-using-dict-comprehensionstop-iteration-return(用于查找使用 raise StopIteration 的生成器,而 return 是停止迭代的正确方法)和 chained-comparison,它建议使用 1 <= x < 5 这样的语法,而不是不太明显的 1 <= x && x > 5

最后,一个在性能方面开销很大的检查器,但非常有用,是 similarities。它旨在通过明确查找代码不同部分之间的复制粘贴来强制执行“不要重复自己”(DRY 原则)。它只有一条消息可以启用:duplicate-code。默认的“最小相似行数”设置为 4。可以使用 .pylintrc 将其设置为不同的值。

[SIMILARITIES]

min-similarity-lines=3

Pylint 使代码审查变得容易

如果您厌倦了代码审查,指出某个类过于复杂,或者两个不同的函数基本上相同,请将 Pylint 添加到您的 持续集成 配置中,并且只对您的项目的复杂性指南进行一次争论。

接下来阅读
标签
Moshe sitting down, head slightly to the side. His t-shirt has Guardians of the Galaxy silhoutes against a background of sound visualization bars.
自 1998 年以来,Moshe 一直参与 Linux 社区,帮助举办 Linux“安装派对”。他自 1999 年以来一直在编写 Python 程序,并为核心 Python 解释器做出了贡献。Moshe 自这些术语出现之前就一直是 DevOps/SRE,非常关心软件可靠性、构建可重复性等问题。

1 条评论

很棒的阅读,感谢您简洁地介绍 Pylint。我编写 Python 代码更多的是采用一种 hacky、脚本的方式,像这样的工具可能真的可以用来建立最佳实践的编码风格。

Creative Commons License该作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.