PyLint, PyChecker hay PyFlakes? [đóng cửa]


390

Tôi muốn nhận được một số phản hồi về các công cụ này trên:

  • đặc trưng;
  • khả năng thích ứng;
  • dễ sử dụng và học đường cong.

1
tiêu chuẩn thẻ nào phải làm với điều này?
SilentGhost

2
Bởi vì bạn sử dụng các công cụ này để khớp với PEP, đặc biệt là PEP 8, đây là tiêu chuẩn cho tất cả các mô-đun Python tích hợp.
e-satis

và những gì khác bạn muốn nó phù hợp? bởi vì đối với pep-8 có một stackoverflow
SilentGhost

Bạn nói đúng, tôi sẽ chuyển sang pep8
e-satis

1
Không nên chỉnh sửa tiêu đề để bao gồm pep8 như một tùy chọn? Lúc đầu, tôi nghĩ các bạn đang nói về đề xuất này, không phải là một gói PyPI thực tế.
Ehtesh Choudhury

Câu trả lời:


275

Chà, tôi hơi tò mò, nên tôi chỉ tự mình kiểm tra 3 cái sau khi đặt câu hỏi ;-)

Ok, đây không phải là một đánh giá rất nghiêm túc nhưng đây là những gì tôi có thể nói:

Tôi đã thử các công cụ với cài đặt mặc định (điều này rất quan trọng vì bạn có thể chọn khá nhiều quy tắc kiểm tra của mình) trên tập lệnh sau:

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

Kết quả là:

  • PyCheckerlà rắc rối vì nó biên dịch mô-đun để phân tích nó. Nếu bạn không muốn mã của mình chạy (ví dụ: nó thực hiện truy vấn SQL), điều đó thật tệ.
  • PyFlakesđược cho là lite. Thật vậy, nó đã quyết định rằng mã là hoàn hảo. Tôi đang tìm kiếm một cái gì đó khá nghiêm trọng vì vậy tôi không nghĩ rằng tôi sẽ tìm kiếm nó.
  • PyLint đã nói rất nhiều và đánh giá mã 3/10 (OMG, tôi là một lập trình viên bẩn!).

Điểm mạnh của PyLint:

  • Báo cáo rất mô tả và chính xác.
  • Phát hiện một số mùi mã. Ở đây nó bảo tôi bỏ lớp để viết một cái gì đó có chức năng vì cách tiếp cận OO là vô ích trong trường hợp cụ thể này. Một cái gì đó tôi biết, nhưng không bao giờ mong đợi một máy tính nói với tôi :-p
  • Mã được sửa hoàn toàn chạy nhanh hơn (không có lớp, không ràng buộc tham chiếu ...).
  • Được thực hiện bởi một đội Pháp. Ok nó không phải là một điểm cộng cho tất cả mọi người, nhưng tôi thích nó ;-)

Nhược điểm của PyLint:

  • Một số quy tắc thực sự nghiêm ngặt. Tôi biết rằng bạn có thể thay đổi nó và mặc định là phù hợp với PEP8, nhưng việc viết 'cho x in seq' có phải là một tội ác không? Rõ ràng là có bởi vì bạn không thể viết một tên biến có ít hơn 3 chữ cái. Tôi sẽ thay đổi điều đó.
  • Rất rất nói nhiều. Hãy sẵn sàng để sử dụng đôi mắt của bạn.

Tập lệnh đã sửa (với chuỗi doc lười biếng và tên biến):

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

BIÊN TẬP :

Nhờ Rudiger Wolf, tôi phát hiện ra pep8chính xác những gì tên của nó gợi ý: khớp với PEP8. Nó đã tìm thấy một số cú pháp no-nos mà PyLint không làm được. Nhưng PyLinttìm thấy những thứ không được liên kết cụ thể với PEP8 nhưng thú vị. Cả hai công cụ đều thú vị và bổ sung.

Cuối cùng, tôi sẽ sử dụng cả hai vì thực sự dễ cài đặt (thông qua các gói hoặc setuptools) và văn bản đầu ra rất dễ dàng để xâu chuỗi.

Để cung cấp cho bạn một ý tưởng nhỏ về đầu ra của họ:

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

Bình luận :

************* 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
Mục đích của pyflakes là phân tích tĩnh mã của bạn để đảm bảo sẽ không có lỗi tên hoặc biến / nhập không sử dụng.
culebrón

4
Tôi đã hiểu sai điều này hay không có điểm mạnh / yếu cho PyChecker cũng như PyFlakes?
Wernight

17
"Điểm mạnh: Báo cáo rất mô tả và chính xác." Báo cáo nào? Đây là phần về tất cả các công cụ hay chỉ là một?
ijk

3
Tôi tự hỏi. Tôi rõ ràng đã viết toàn bộ pro / con chỉ về PyLint. Tôi không biết tại sao tôi lại viết theo cách ngu ngốc này. Hangover có lẽ? Xin lỗi các bạn.
e-satis

13
flake8 bao gồm cả pyflakespep8. Mạnh mẽ đề nghị nó hơn chỉ sử dụng cái này hay cái khác.
Ehtesh Choudhury

93

pep8 gần đây đã được thêm vào PyPi.

  • pep8 - Trình kiểm tra hướng dẫn kiểu Python
  • pep8 là một công cụ để kiểm tra mã Python của bạn theo một số quy ước kiểu trong PEP 8.

Bây giờ rất dễ dàng để kiểm tra mã của bạn chống lại pep8.

Xem http://pypi.python.org/pypi/pep8


57
Có IMO gói tốt hơn. flake8, nó kết hợp cả hai và thêm độ phức tạp có điều kiện, hoạt động trên các thư mục và nói chung là tốt.
DinGODzilla

1
Chạy flake8lần đầu tiên đã dạy tôi rằng tôi đã nhảy ngay vào một dự án mà không biết rằng Python rất thích không gian vì một số lý do. Tôi đã phải sử dụng --ignore W191để làm cho đầu ra hữu ích.
cjm

3
Lưu ý rằng các phiên bản gần đây của pep8bây giờ được gọi là pycodestyle; xem pypi.org/project/pycodestyle @cjm: python rất thích không gian bởi vì đó là những gì được chỉ định bởi các nguyên tắc phong cách. Không gian không nhất thiết phải vượt trội, nhưng tính nhất quán trên toàn cộng đồng là một lợi thế lớn và cộng đồng đã quyết định về không gian, vì vậy hãy làm điều đó.
Chris L. Barnes

Làm cách nào để định cấu hình tốt nhất cho trình soạn thảo của tôi (BBEdit hoặc vim) để sử dụng khoảng trắng cho Python và các tab cho tất cả mọi thứ khác? Có vẻ như (ít nhất là đối với BBEdit), đó là một thiết lập toàn cầu.
cjm

1
@cjm Trong vim, bạn có thể làm :set et(viết tắt expandtabs) và sau đó :retabđể chuyển đổi tất cả các tab trong bộ đệm hiện tại thành khoảng trắng. Nó cũng có thể hữu ích để thiết lập ts=4 sts=4 sw=4( tabstop, softtabstop, shiftwidth) đầu tiên. Theo cách tiếp cận chung, tôi thích sử dụng Editorconfig.org và các plugin của nó để đặt các cài đặt phù hợp trong repo, vì vậy bạn không phải lo lắng về việc cấu hình lại trình soạn thảo của mình cho các cơ sở mã khác nhau.
codermonkeyfuel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.