PyLint,PyChecker或PyFlakes?

我想在这些工具上得到一些反馈意见:

  • 特征;
  • 适应性;
  • 易用性和学习曲线。

那么,我有点好奇,所以我只是在问这个问题之后自己testing了一下;-)

好的,这不是一个非常严肃的评论,但是我可以这样说:

我尝试使用默认设置的工具(这很重要,因为您几乎可以select您的检查规则)在以下脚本中:

#!/usr/local/bin/python # by Daniel Rosengren modified by e-satis import sys, time stdout = sys.stdout BAILOUT = 16 MAX_ITERATIONS = 1000 class Iterator(object) : def __init__(self): print 'Rendering...' for y in xrange(-39, 39): stdout.write('\n') for x in xrange(-39, 39): if self.mandelbrot(x/40.0, y/40.0) : stdout.write(' ') else: stdout.write('*') def mandelbrot(self, x, y): cr = y - 0.5 ci = x zi = 0.0 zr = 0.0 for i in xrange(MAX_ITERATIONS) : temp = zr * zi zr2 = zr * zr zi2 = zi * zi zr = zr2 - zi2 + cr zi = temp + temp + ci if zi2 + zr2 > BAILOUT: return i return 0 t = time.time() Iterator() print '\nPython Elapsed %.02f' % (time.time() - t) 

结果是 :

  • PyChecker很麻烦,因为它编译模块来分析它。 如果你不想让你的代码运行(例如,它执行一个SQL查询),这是不好的。
  • PyFlakes应该是lite。 事实上,它决定代码是完美的。 我正在寻找相当严重的事情,所以我不认为我会去。
  • PyLint一直非常健谈,并将代码评为3/10(OMG,我是一个脏编码器!)。

特点:

  • 非常具有描述性和准确性的报告。
  • 检测一些代码的气味。 在这里,它告诉我放弃我的课程来写一些function,因为面向对象的方法在这个特定的情况下是无用的。 我知道的东西,但从来没有预料到电脑告诉我:-p
  • 完全纠正的代码运行得更快(没有类,没有引用绑定…)。
  • 由法国队制造。 好吧,这不是每个人的加分,但我喜欢它;-)

缺点:

  • 一些规则是非常严格的。 我知道你可以改变它,默认是匹配PEP 8,但是写'for x in seq'是一种犯罪吗? 显然是的,因为你不能写less于3个字母的variables名。 我会改变这一点。
  • 非常非常健谈。 准备好使用你的眼睛。

更正的脚本(使用惰性文档string和variables名称):

 #!/usr/local/bin/python # by Daniel Rosengren, modified by e-satis """ Module doctring """ import time from sys import stdout BAILOUT = 16 MAX_ITERATIONS = 1000 def mandelbrot(dim_1, dim_2): """ function doc string """ cr1 = dim_1 - 0.5 ci1 = dim_2 zi1 = 0.0 zr1 = 0.0 for i in xrange(MAX_ITERATIONS) : temp = zr1 * zi1 zr2 = zr1 * zr1 zi2 = zi1 * zi1 zr1 = zr2 - zi2 + cr1 zi1 = temp + temp + ci1 if zi2 + zr2 > BAILOUT: return i return 0 def execute() : """ func doc string """ print 'Rendering...' for dim_1 in xrange(-39, 39): stdout.write('\n') for dim_2 in xrange(-39, 39): if mandelbrot(dim_1/40.0, dim_2/40.0) : stdout.write(' ') else: stdout.write('*') START_TIME = time.time() execute() print '\nPython Elapsed %.02f' % (time.time() - START_TIME) 

编辑:

感谢Rudiger Wolf,我发现了pep8,正如其名字所暗示的那样:匹配PEP8。 它发现PyLint没有的几个语法no-nos。 但是PyLint发现了一些与PEP8没有特别关联的东西,但是很有趣。 这两个工具都是有趣的和互补的

最后我会使用两者,因为真的很容易安装(通过包或setuptools)和输出文本是很容易链接。

给你一点他们的输出的想法:

pep8

 ./python_mandelbrot.py:4:11: E401 multiple imports on one line ./python_mandelbrot.py:10:1: E302 expected 2 blank lines, found 1 ./python_mandelbrot.py:10:23: E203 whitespace before ':' ./python_mandelbrot.py:15:80: E501 line too long (108 characters) ./python_mandelbrot.py:23:1: W291 trailing whitespace ./python_mandelbrot.py:41:5: E301 expected 1 blank line, found 3 

PyLint:

 ************* Module python_mandelbrot C: 15: Line too long (108/80) C: 61: Line too long (85/80) C: 1: Missing docstring C: 5: Invalid name "stdout" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$) C: 10:Iterator: Missing docstring C: 15:Iterator.__init__: Invalid name "y" (should match [a-z_][a-z0-9_]{2,30}$) C: 17:Iterator.__init__: Invalid name "x" (should match [a-z_][a-z0-9_]{2,30}$) [...] and a very long report with useful stats like : Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ 

pep8最近被添加到PyPi。

  • pep8 – Python风格指南检查器
  • pep8是一个工具来检查您的Python代码对照PEP 8中的一些风格约定。

现在用pep8检查你的代码是非常容易的。

请参阅http://pypi.python.org/pypi/pep8