PyLint, PyChecker або PyFlakes? [зачинено]


390

Я хотів би отримати кілька відгуків щодо цих інструментів щодо:

  • особливості;
  • пристосованість;
  • простота використання та крива навчання.

1
яке стандартне теги пов'язане з цим?
SilentGhost

2
Оскільки ви використовуєте ці інструменти для відповідності PEP, особливо PEP 8, що є стандартом для всіх вбудованих модулів Python.
e-satis

і які ще ви хочете, щоб вони відповідали? тому що для PEP-8 є однозначний тег stackoverflow.com/questions/tagged/pep8
SilentGhost

Ви маєте рацію, я перейду на pep8
e-satis

1
Чи не слід редагувати заголовок, щоб включити pep8 як варіант? Спочатку я подумав, що ви, хлопці, говорили про пропозицію, а не про фактичний пакет PyPI.
Ehtesh Choudhury

Відповіді:


275

Ну, я трохи цікавий, тому я просто тестував 3 відразу після того, як задав питання ;-)

Гаразд, це не дуже серйозний огляд, але ось що я можу сказати:

Я спробував інструменти з налаштуваннями за замовчуванням (це важливо, оскільки ви можете майже вибрати свої правила перевірки) на наступному сценарії:

#!/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 (OMG, я брудний кодер!).

Сильні моменти PyLint:

  • Дуже описовий і точний звіт.
  • Виявлення деяких запахів коду. Тут мені сказали відмовитись від класу, щоб написати щось з функціями, оскільки підхід ОО в даному конкретному випадку був марним. Щось я знав, але ніколи не сподівався, що комп'ютер мені скаже :-p
  • Повністю виправлений код працює швидше (немає класу, немає прив'язки посилань ...).
  • Виконана французькою командою. Ок, це не плюс для всіх, але мені це подобається ;-)

Мінуси PyLint:

  • Деякі правила справді суворі. Я знаю, що ви можете це змінити і за замовчуванням відповідати PEP8, але чи таке злочин писати "для x в послідовності"? Мабуть, так, тому що ви не можете написати ім'я змінної менш ніж 3 букви. Я це зміню.
  • Дуже дуже балакучий. Будьте готові використовувати очі.

Виправлений сценарій (із ледачими рядками doc та назвами змінних):

#!/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)

Редагувати:

Завдяки Рудігеру Вольфу я виявив, pep8що робить саме те, що підказує його назва: відповідність PEP8. Він знайшов декілька синтаксисів no-nos, яких PyLint не робив. Але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    |=          |
+-------------------------+------+---------+-----------+

18
Мета pyflakes - статично проаналізувати ваш код, щоб переконатися у відсутності помилок імені та невикористаних змінних / імпорту.
culebrón

4
Я помиляюсь, чи немає сильної / слабкої точки для PyChecker і PyFlakes?
Wernight

17
"Сильні моменти: Дуже описовий і точний звіт". Який звіт? Цей розділ про всі інструменти чи лише один?
ijk

3
Цікаво. Я, мабуть, написав цілий про / кон тільки про PyLint. Я поняття не маю, чому я писав таким дурним способом. Похмілля, можливо? Вибачте, хлопці.
e-satis

13
пластівці8 охоплюють як pyflakesі pep8. Настійно рекомендуємо це просто використовувати те чи інше.
Ehtesh Choudhury

93

pep8 нещодавно додали в PyPi.

  • pep8 - перевірка стилю Python
  • pep8 - це інструмент для перевірки вашого Python-коду на відповідність деяким стильовим умовам PEP 8.

Зараз перевірити свій код на pep8 дуже просто.

Див. Http://pypi.python.org/pypi/pep8


57
Є кращий пакет IMO. flake8, він поєднує в собі два і додає умовної складності, працює над каталогами і, як правило, добре.
DinGODzilla

1
Біг flake8вперше навчив мене, що я стрибнув прямо в проект, не дізнавшись, що Python чомусь віддає перевагу простору. Мені довелося скористатися, --ignore W191щоб зробити корисний результат.
cjm

3
Зауважте, що останні виклики версій pep8тепер називаються pycodestyle; див. pypi.org/project/pycodestyle @cjm: python сильно віддає перевагу пробілам, тому що саме це визначено правилами щодо стилів. Простори не обов'язково є вищими, але послідовність у спільноті є великою перевагою, і громада визначилася з просторами, так що робіть це.
Кріс Л. Барнс

Як мені найкраще налаштувати свій редактор (або BBEdit, або vim), щоб використовувати пробіли для Python та вкладки для абсолютно всього іншого? Здається, що (принаймні, для BBEdit) це глобальна настройка.
cjm

1
@cjm In vim, ви можете зробити :set et(скоротити expandtabs), а потім :retabперетворити всі вкладки в поточному буфері в пробіли. Він також може бути корисно для установки ts=4 sts=4 sw=4( tabstop, softtabstop, shiftwidth) в першу чергу. Що стосується загального підходу, я вважаю за краще використовувати editorconfig.org та його плагіни для встановлення правильних налаштувань репо, тому вам не доведеться турбуватися про налаштування редактора для різних баз коду.
codermonkeyfuel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.