PyLint, PyChecker หรือ PyFlakes? [ปิด]


390

ฉันต้องการรับความคิดเห็นเกี่ยวกับเครื่องมือเหล่านี้ใน:

  • มี;
  • การปรับตัว;
  • ใช้งานง่ายและเรียนรู้โค้ง

1
มาตรฐานแท็กใดที่เกี่ยวข้องกับสิ่งนี้
SilentGhost

2
เนื่องจากคุณใช้เครื่องมือนี้เพื่อจับคู่ PEP โดยเฉพาะ PEP 8 ซึ่งเป็นมาตรฐานสำหรับโมดูล Python ในตัวทั้งหมด
e-Satisfaction

และคุณต้องการให้ peps อื่นจับคู่กับอะไร เพราะสำหรับ 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ควรจะเป็น lite แน่นอนมันตัดสินใจว่ารหัสนั้นสมบูรณ์แบบ ฉันกำลังมองหาบางอย่างที่ค่อนข้างรุนแรงดังนั้นฉันไม่คิดว่าฉันจะไปหามัน
  • PyLint เป็นคนช่างพูดมากและให้คะแนนรหัส 3/10 (OMG ฉันเป็นคนทำรหัสสกปรก!)

จุดเด่นของPyLint:

  • รายงานที่มีความหมายและถูกต้องมาก
  • ตรวจจับกลิ่นของรหัส นี่มันบอกให้ฉันเลิกชั้นเรียนเพื่อเขียนบางอย่างด้วยฟังก์ชั่นเพราะวิธีการ OO นั้นไร้ประโยชน์ในกรณีนี้โดยเฉพาะ สิ่งที่ฉันรู้ แต่ไม่เคยคาดหวังว่าคอมพิวเตอร์จะบอกฉัน :-p
  • รหัสที่แก้ไขอย่างเต็มที่ทำงานได้เร็วขึ้น (ไม่มีคลาสไม่มีการเชื่อมโยงการอ้างอิง ... )
  • ทำโดยทีมฝรั่งเศส ตกลงมันไม่ใช่ข้อดีสำหรับทุกคน แต่ฉันชอบมัน ;-)

ข้อเสียของPyLint:

  • กฎบางข้อเข้มงวดจริงๆ ฉันรู้ว่าคุณสามารถเปลี่ยนแปลงได้และค่าเริ่มต้นคือการจับคู่ PEP8 แต่มันเป็นอาชญากรรมที่จะเขียน 'for x in seq' หรือไม่? เห็นได้ชัดว่าใช่เพราะคุณไม่สามารถเขียนชื่อตัวแปรที่มีตัวอักษรน้อยกว่า 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)

แก้ไข:

ขอบคุณ Rudiger Wolf ฉันค้นพบ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
flake8ครอบคลุมทั้งสองและ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เป็นครั้งแรกสอนให้ฉันรู้ว่าฉันกระโดดเข้าหาโปรเจ็กต์โดยไม่ได้เรียนรู้ว่างูใหญ่ชอบช่องว่างด้วยเหตุผลบางอย่าง ฉันต้องใช้--ignore W191เพื่อให้ผลลัพธ์มีประโยชน์
cjm

3
โปรดทราบว่าpep8ขณะนี้มีการเรียกเวอร์ชันล่าสุดของpycodestyle; ดูpypi.org/project/pycodestyle @cjm: python ขอแนะนำช่องว่างอย่างมากเพราะนั่นคือสิ่งที่ระบุไว้ในแนวทางของสไตล์ ช่องว่างไม่จำเป็นต้องเหนือกว่า แต่ความสม่ำเสมอทั่วทั้งชุมชนเป็นข้อได้เปรียบที่ยอดเยี่ยมและชุมชนได้ตัดสินใจเลือกพื้นที่ว่างแล้ว
Chris L. Barnes

ฉันจะกำหนดค่าตัวแก้ไขของฉัน (BBEdit หรือ vim) ให้ดีที่สุดเพื่อใช้ช่องว่างสำหรับ Python และแท็บสำหรับทุกอย่างได้อย่างไร ดูเหมือนว่า (อย่างน้อยสำหรับ BBEdit) เป็นการตั้งค่าระดับโลก
cjm

1
@cjm ในกลุ่มคุณสามารถทำ:set et(ย่อสำหรับexpandtabs) แล้ว:retabแปลงแท็บทั้งหมดในบัฟเฟอร์ปัจจุบันเป็นช่องว่าง นอกจากนี้ยังอาจเป็นประโยชน์กับชุดts=4 sts=4 sw=4( tabstop, softtabstop, shiftwidth) เป็นครั้งแรก สำหรับวิธีการทั่วไปฉันชอบใช้editorconfig.orgและปลั๊กอินเพื่อตั้งค่าการตั้งค่าที่เหมาะสมใน repo ดังนั้นคุณไม่ต้องกังวลเกี่ยวกับการกำหนดค่าโปรแกรมแก้ไขของคุณอีกครั้งสำหรับฐานรหัสที่แตกต่างกัน
codermonkeyfuel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.