PyLint, PyChecker veya PyFlakes? [kapalı]


390

Bu araçlar hakkında bazı geri bildirimler almak istiyorum:

  • özellikleri;
  • uyum;
  • kullanım kolaylığı ve öğrenme eğrisi.

1
bununla hangi etiket standardının ilgisi var?
SilentGhost

2
Çünkü bu araçları PEP, özellikle de tüm yerleşik Python modülleri için standart olan PEP 8 ile eşleştirmek için kullanırsınız.
e-satis

ve başka hangi pepslerin eşleşmesini istiyorsun? çünkü pep-8 için açık bir etiket var stackoverflow.com/questions/tagged/pep8
SilentGhost

Haklısın, pep8'e geçeceğim
e-satis

1
Başlık, pep8'i bir seçenek olarak içerecek şekilde düzenlenmemeli mi? İlk başta, sizden gerçek bir PyPI paketi değil, teklif hakkında konuştuğunuzu sanıyordum.
Ehtesh Choudhury

Yanıtlar:


275

Biraz meraklıyım, bu yüzden soruyu sorduktan hemen sonra 3'ü kendim test ettim ;-)

Tamam, bu çok ciddi bir inceleme değil ama işte ne diyebilirim:

Aşağıdaki komut dosyasında varsayılan ayarlarla araçları denedim (hemen hemen kontrol kurallarınızı seçebileceğiniz için önemlidir):

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

Sonuç olarak :

  • PyCheckerzahmetlidir, çünkü modülü analiz etmek için derler. Kodunuzun çalışmasını istemiyorsanız (örneğin, bir SQL sorgusu gerçekleştirir), bu kötüdür.
  • PyFlakeslite olması gerekiyordu. Gerçekten de, kodun mükemmel olduğuna karar verdi. Oldukça ağır bir şey arıyorum, bu yüzden gideceğimi sanmıyorum.
  • PyLint çok konuşkan ve kod 3/10 (OMG, ben kirli bir kodlayıcı!) puan.

Güçlü noktalar PyLint:

  • Çok açıklayıcı ve doğru rapor.
  • Bazı kod kokularını tespit edin. Burada fonksiyonlarla bir şeyler yazmak için sınıfımı bırakmamı söyledi çünkü OO yaklaşımı bu özel durumda işe yaramadı. Bildiğim bir şey ama bir bilgisayarın bana söylemesini beklemiyordum :-p
  • Tamamen düzeltilmiş kod daha hızlı çalışır (sınıf yok, referans bağlaması yok ...).
  • Bir Fransız ekibi tarafından yapıldı. Tamam bu herkes için bir artı değil, ama hoşuma gitti ;-)

Eksileri PyLint:

  • Bazı kurallar gerçekten katıdır. Değiştirebilir ve varsayılan PEP8 maç olduğunu biliyorum, ama 'seq içinde x için yazmak böyle bir suç mudur? Görünüşe göre evet, çünkü 3 harften daha az değişken adı yazamazsınız. Bunu değiştireceğim.
  • Çok konuşkan. Gözlerini kullanmaya hazır ol.

Düzeltilmiş komut dosyası (tembel belge dizeleri ve değişken adlarıyla):

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

DÜZENLE :

Rudiger Wolf sayesinde pep8, tam olarak adının önerdiğini yaptığını keşfettim : PEP8'i eşleştirmek. PyLint'in yapmadığı birkaç sözdizimi no-nos buldu. Ancak PyLintözellikle PEP8 ile bağlantılı olmayan ama ilginç olan şeyler bulundu. Her iki araç da ilginç ve tamamlayıcıdır.

Sonunda her ikisini de kullanacağım çünkü kurulumu gerçekten kolay (paketler veya kurulum araçları aracılığıyla) ve çıktı metninin zincirlenmesi çok kolay.

Size çıktıları hakkında küçük bir fikir vermek için:

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'in amacı, ad hatası veya kullanılmayan değişken / içe aktarma olmayacağından emin olmak için kodunuzu statik olarak analiz etmektir.
culebrón

4
Bunu yanlış mı anlıyorum veya PyChecker veya PyFlakes için güçlü / zayıf bir nokta yok mu?
Wernight

17
"Güçlü noktalar: Çok açıklayıcı ve doğru rapor." Hangi rapor? Bu bölüm tüm araçlarla mı yoksa sadece biriyle mi ilgili?
Ijk

3
Merak ediyorum. Açıkçası tüm pro / con sadece PyLint hakkında yazdım. Neden bu kadar aptalca yazdığımı bilmiyorum. Akşamdan kalma belki? Üzgünüm beyler.
e-satis

13
flake8 her ikisini de kapsar pyflakesve pep8. Şiddetle sadece birini veya diğerini kullanarak önerin.
Ehtesh Choudhury

93

pep8 yakın zamanda PyPi'ye eklendi.

  • pep8 - Python tarzı kılavuz denetleyicisi
  • pep8, PEP 8'deki bazı stil kurallarına karşı Python kodunuzu kontrol etmek için bir araçtır.

Kodunuzu pep8'e karşı kontrol etmek artık çok kolay.

Bkz. Http://pypi.python.org/pypi/pep8


57
IMO daha iyi bir paket var. flake8, ikisini birleştirir ve koşullu karmaşıklık ekler, dizinler üzerinde çalışır ve genellikle iyidir.
DinGODzilla

1
flake8İlk kez koşmak bana Python'un bir sebepten ötürü boşlukları tercih ettiğini öğrenmeden bir projeye atladığımı öğretti. --ignore W191Çıktıyı faydalı kılmak için kullanmak zorunda kaldım .
cjm

3
Son sürümlerinin pep8artık çağrıldığını unutmayın pycodestyle; bkz. pypi.org/project/pycodestyle @cjm: python boşlukları kesinlikle tercih ediyor çünkü stil yönergeleri tarafından belirtilen şey bu. Alanlar mutlaka üstün değildir, ancak topluluk genelinde tutarlılık büyük bir avantajdır ve topluluk alanlara karar vermiştir, bunu yapın.
Chris L. Barnes

Düzenleyicimi (BBEdit veya vim) Python için boşluklar ve diğer her şey için sekmeler kullanacak şekilde en iyi nasıl yapılandırabilirim? Görünüşe göre (en azından BBEdit için) küresel bir ortam.
cjm

1
@cjm Vim'de , geçerli arabellekteki tüm sekmeleri boşluklara dönüştürmek :set et(kısaltmak expandtabs) ve sonra yapabilirsiniz :retab. Ayrıca ayarlamak yararlı olabilir ts=4 sts=4 sw=4( tabstop, softtabstop, shiftwidth) ilk. Genel bir yaklaşım olarak, bir repoda doğru ayarları ayarlamak için editorconfig.org ve eklentilerini kullanmayı tercih ediyorum , bu nedenle editörünüzü farklı kod tabanları için yeniden yapılandırmak konusunda endişelenmenize gerek yok.
codermonkeyfuel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.