为什么Pylint既有用又不能用,以及如何使用它

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

作者Itamar Turner-Trauring,2016年10月19日
本文关于一个工具,该工具在代码发布前捕获影响生产环境的错误。但是因为一些理由大型项目都不使用它。你读完本文会明白为什么这个工具有用,为什么不能用,以及Python项目中应该如何有效地使用它。
(不是Python程序员?同样的问题和解决方案可能适用于你的生态系统。)
Pylint化险为夷

如果用Haskell编码,编译器帮了你。如果用Java编码,编译器通常伸出援助之手。但是如果使用动态语言像Python或Ruby编码,你只能靠自己:编译器不会为你捕获错误。
退而求其次,使用启发式捕获错误的工具。Pylint就是这样一个工具,这里说下我是如何开始使用它的。
有一天工作时,我们意识到编译已经持续错误几天了,它不是通常的间歇性故障。经过几天的调查,同事Tom Prince发现了问题。它是Python代码,看起来像这样:

1.png

注意第二个for循环的错误。结合Python从块泄露变量的事实,volume在第一个for循环的最后值用于第二个for循环的每次迭代。
未来是否能防止这些问题的发生,我试了试Pylint,再次引入该错误。。。,确实它捕获了这个问题。然后,我看了其余的输出,看看它发现了什么。
它发现了一个严重的错误。它是我几天前写的代码,并且该错误完全破坏了一个重要的功能,这第二天我们将发布给用户。下面是该错误的大量简化最小版本:

2.png

预期结果是打印:
1
2
3
但是该代码实际会打印:
3
3
3

Python中定义内嵌函数时,涉及外部范围变量,它绑定的不是变量的值而是变量本身。本例中,printer()内部的i,总是变量i在for循环中的最后值。
幸运的是Pylint在发布之前捕获了错误;很好,对吗?
为什么没人使用Pylint

Pylint有用,但很多项目不使用它。例如,我刚检查过了,Twisted、Django、Flask、Sphinx都不使用Pylint。为什么这些大的、复杂的Python项目不使用自动捕获错误的工具?
一个问题是它缓慢,但这不是真正的问题;你可以在CI系统运行其它慢测试。真正的问题是输出量。
意思是:运行pylint检测Twisted,结果输出是28,000行(假设新版本会修正)。再说一遍:28,000行错误或警告。
这太疯狂了。
客观来讲,Twisted的编码标准与Python主流不相符,但我其它项目的经验也是如此。Pylint有很多有用的错误。。。但也有很多完全无用的垃圾假设你的代码应该如何。从根本上说,它对待它们都一样;例如,警告和错误之间有区别,但在实践中,有用和无用的东西都在警告类别。
例如:
W:675, 0: Class has no __init__ method (no-init)
这是一个无用警告。现在想象有几千个无用警告。
应该如何使用Pylint

所以我们有一个工具,可能是有用的,但是实践中不能用。怎么办? 
幸运的是Pylint中有些功能可以帮助:用检查白名单配置它。
首先,设置Pylint什么都不做:
  1. 从Pylint docs列出所有你可能启用的功能,将它们配置到.pylintrc白名单。
  2. 将它们全注释。
这时Pylint将不检查。接着:
  1. 取消注释小批量检查,运行pylint。
  2. 如果产生的错误真的是问题,修复它们。如果完全是垃圾,从配置中删除这些检查。
这时有小数量可能有用的检查通过:运行pylint只会被告知新问题。换句话说,你有一个有用工具。
重复这个过程几次,或者每周一次,每次启用一批新的检查,直到你的耐心用完或者运行完可以启用的Pylint检查。
最终的结果会像这个配置(https://github.com/ClusterHQ/flocker/blob/master/.pylintrc)或者这个配置(https://github.com/datawire/quark/blob/master/.pylintrc);这两个项目在Apache2.0许可下都是开源的,所以你可以使用那些作为出发点。
向前,使用lint

这是我对你的挑战:如果你是Python程序员,今天在一个项目上安装Pylint。它需要一个小时才能得到一些最低限度的检查,总有一天它会捕获影响生产环境的错误。如果你不是Python程序员,可能会找到一些你使用的语言的相应工具。
如果你是lint工具的作者,尝试想出更好的默认值。捕获60%的错误有10,000软件项目使用你的工具,胜于捕获70%的错误没有人使用。

英文原文:https://codewithoutrules.com/2016/10/19/pylint/
译者:毛茸茸的向日葵
 

2月15日11:00到13:00网站停机维护,13:00前恢复