PyLint, PyChecker or PyFlakes?
我想就以下工具获得一些反馈:
- 特征;
- 适应性;
- 易用性和学习曲线。
嗯,我有点好奇,所以我刚问完问题就亲自测试了3个;-)
好吧,这不是一个很严肃的评论,但我可以这样说:
我在下面的脚本上尝试了使用默认设置的工具(这很重要,因为您几乎可以选择检查规则):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #!/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(' ') 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 ' Python Elapsed %.02f' % (time.time() - t) |
因此:
PyChecker 很麻烦,因为它编译模块来分析它。如果您不希望代码运行(例如,它执行一个SQL查询),那就太糟糕了。PyFlakes 应该是精简的。事实上,它认为代码是完美的。我在找一些比较严重的东西,所以我不想去买。PyLint 一直很健谈,评分是3/10(天哪,我是个肮脏的编码员!).
- 非常描述性和准确的报告。
- 检测一些代码气味。在这里,它告诉我放下我的类,用函数编写一些东西,因为OO方法在这个特定的情况下是无用的。我知道一些事情,但从来没想过电脑会告诉我:-p
- 完全更正的代码运行得更快(没有类,没有引用绑定…)。
- 由法国队制造。好吧,这对每个人都不是好处,但我喜欢;-)
- 有些规则非常严格。我知道你可以更改它,默认值是匹配pep8,但是写"for x in seq"这样的犯罪行为吗?显然是的,因为你不能用少于3个字母来写变量名。我会改变的。
- 非常健谈。准备好用你的眼睛。
更正的脚本(使用延迟的文档字符串和变量名):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #!/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(' ') 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 ' Python Elapsed %.02f' % (time.time() - START_TIME) |
号
编辑:
多亏了鲁迪格·沃尔夫,我发现了一种叫
最后,我将同时使用这两种方法,因为它们确实很容易安装(通过软件包或安装工具),并且输出文本很容易链接。
让你了解一下他们的产出:
PEP8:
1 2 3 4 5 6 | ./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 |
皮林特:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | ************* 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是一个工具,用于根据PEP8中的一些样式约定检查您的Python代码。
现在根据PEP8检查代码非常容易。
参见http://pypi.python.org/pypi/pep8