Python Pylint、PyChecker还是PyFlakes?

Python Pylint、PyChecker还是PyFlakes?,python,pylint,pep8,pyflakes,pychecker,Python,Pylint,Pep8,Pyflakes,Pychecker,我想从以下方面获得有关这些工具的一些反馈: 特征 适应性 易用性和学习曲线 嗯,我有点好奇,所以我在问了这个问题之后就自己测试了这三个;-) 好的,这不是一个非常严肃的评论,但我可以说: 我在以下脚本上尝试了带有默认设置的工具(这很重要,因为您几乎可以选择您的检查规则): #!/usr/local/bin/python # by Daniel Rosengren modified by e-satis import sys, time stdout = sys.stdout BAILOUT

我想从以下方面获得有关这些工具的一些反馈:

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

嗯,我有点好奇,所以我在问了这个问题之后就自己测试了这三个;-)

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

我在以下脚本上尝试了带有默认设置的工具(这很重要,因为您几乎可以选择您的检查规则):

#!/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
    应该是轻的。事实上,它认为代码是完美的。我正在寻找一些相当严重的事情,所以我不认为我会去做
  • PyLint
    非常健谈,评分为代码3/10(天哪,我是个肮脏的程序员!)
PyLint的优点:

  • 非常描述性和准确的报告
  • 检测一些代码气味。在这里,它告诉我放弃我的类来编写带有函数的东西,因为OO方法在这种特定情况下是无用的。有些事我知道,但没想到电脑会告诉我
  • 完全更正的代码运行得更快(没有类,没有引用绑定…)
  • 由法国队制作。好吧,这不是对每个人都有利,但我喜欢;-)
Pylint的缺点:

  • 有些规定真的很严格。我知道您可以更改它,默认值是匹配PEP8,但是在seq中写“for x”是犯罪行为吗?显然是的,因为你不能写一个少于3个字母的变量名。我会改变的
  • 非常健谈。准备好用你的眼睛
已更正的脚本(带有惰性文档字符串和变量名):

,我发现
pep8
正是它的名字所暗示的:匹配pep8。它发现了一些Pylint没有的语法no no。但派林发现了一些与PEP8没有特别联系但很有趣的东西。这两种工具都很有趣,而且相互补充

最终,我将使用这两种工具,因为它们非常容易安装(通过软件包或setuptools),而且输出文本非常容易链接

让您了解一下他们的产出:

pep8

/python\u mandelbrot.py:4:11:E401一行多个导入
./python_mandelbrot.py:10:1:E302应为2个空行,找到1个
./python_mandelbrot.py:10:23:E203“:”之前的空格
./python_mandelbrot.py:15:80:E501行太长(108个字符)
./python_mandelbrot.py:23:1:W291尾部空白
./python_mandelbrot.py:41:5:E301应为1个空行,找到3个
Pylint

*************模块python\u mandelbrot
C:15:线路太长(108/80)
C:61:行太长(85/80)
C:1:缺少文档字符串
C:5:无效名称“stdout”(应匹配([A-Z_u2;][A-Z0-9_2;]*)|(u2;。*2;))$)
C:10:迭代器:缺少docstring
C:15:Iterator.\uuuuu init\uuuuuuu:无效名称“y”(应匹配[a-z_uuu][a-z0-9_uuu]{2,30}$)
C:17:Iterator.\uuuuu init\uuuuuuu:无效的名称“x”(应该匹配[a-z][a-z0-9.]{2,30}$)
[…]还有一份很长的报告,其中包含有用的统计数据,如:
复制品
-----------
+-------------------------+------+---------+-----------+
||现在|以前|不同|
+=========================+======+=========+===========+
|nb重复行| 0 | 0 |=|
+-------------------------+------+---------+-----------+
|重复行的百分比| 0.000 | 0.000 |=|
+-------------------------+------+---------+-----------+

pep8最近被添加到PyPi中

  • pep8-Python样式指南检查器
  • pep8是一个工具,用于根据pep8中的一些样式约定检查Python代码
现在,对照pep8检查代码非常容易


请参见

标记标准与此有何关系?因为您使用此工具来匹配PEP,特别是所有内置Python模块的标准PEP 8。您希望它与其他哪些PEP匹配?因为对于pep-8,有一个明确的标记,您是对的,我将切换到pep8标题不应该编辑为包含pep8作为选项吗?一开始,我以为你们在谈论这个命题,而不是一个实际的PyPI包。pyflakes的目的是静态分析代码,以确保没有名称错误或未使用的变量/导入。我是不是搞错了,或者PyChecker和pyflakes都没有优缺点?“优点:非常描述性和准确的报告。“哪份报告?这一部分是关于所有的工具还是仅仅一个?我想知道。我显然只写了关于派林的所有赞成/反对意见。我不知道我为什么用这种愚蠢的方式写作。可能是宿醉?对不起,伙计们。包括
pyflakes
pep8
。强烈建议不要只使用其中一种。IMO有更好的软件包,它将两者结合起来,增加了条件复杂性,适用于目录,而且通常很好。第一次运行
flake8
告诉我,我直接进入了一个项目,而没有意识到Python出于某种原因强烈偏爱空格。我不得不使用
--忽略W191
使输出有用。请注意,
pep8
的最新版本现在称为
pycodestyle
;请参见@cjm:python强烈偏爱空格,因为这是样式指南所指定的。空间并不一定优越,但整个社区的一致性是一个很大的优势,社区已经决定使用空间,所以请这样做。我如何最好地配置我的编辑器(BBEdit或vim),以便将空间用于Python,并将选项卡用于其他一切?看起来(至少对于BBEdit而言)这是一个全局设置。@cjm在vim中,您可以执行
:set et
(缩写为
expandtabs#!/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)