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.
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âu trả lời:
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à:
PyChecker
là 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
:
Nhược điểm của PyLint
:
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 pep8
chí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 PyLint
tì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 |= |
+-------------------------+------+---------+-----------+
pep8 gần đây đã được thêm vào PyPi.
Bây giờ rất dễ dàng để kiểm tra mã của bạn chống lại pep8.
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.
flake8
lầ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.
pep8
bâ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 đó.
: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.