PyLint, PyChecker atau PyFlakes? [Tutup]

390

Saya ingin mendapatkan umpan balik tentang alat ini di:

  • fitur;
  • kemampuan beradaptasi;
  • kemudahan penggunaan dan kurva belajar.
e-satis
sumber
1
standar tag apa yang harus dilakukan dengan ini?
SilentGhost
2
Karena Anda menggunakan alat ini untuk mencocokkan PEP, terutama PEP 8 yang merupakan standar untuk semua modul Python bawaan.
e-satis
dan peps apa lagi yang Anda ingin cocok? karena untuk pep-8 ada tag yang tidak ambigu stackoverflow.com/questions/tagged/pep8
SilentGhost
Anda benar, saya akan beralih ke PEP8
e-satis
1
Bukankah seharusnya judul diedit untuk memasukkan pep8 sebagai opsi? Pada awalnya, saya pikir kalian berbicara tentang proposisi, bukan paket PyPI yang sebenarnya.
Ehtesh Choudhury

Jawaban:

275

Yah, saya agak penasaran, jadi saya hanya menguji 3 sendiri setelah mengajukan pertanyaan ;-)

Ok, ini bukan ulasan yang sangat serius tapi ini yang bisa saya katakan:

Saya mencoba alat-alat dengan pengaturan default (ini penting karena Anda dapat memilih aturan cek) pada skrip berikut:

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

Hasil dari :

  • PyCheckerbermasalah karena mengkompilasi modul untuk menganalisanya. Jika Anda tidak ingin kode Anda dijalankan (misalnya, ia menjalankan query SQL), itu buruk.
  • PyFlakesseharusnya lite. Memang, itu memutuskan bahwa kode itu sempurna. Saya mencari sesuatu yang sangat parah sehingga saya tidak berpikir saya akan melakukannya.
  • PyLint telah sangat cerewet dan diberi nilai kode 3/10 (OMG, saya seorang programmer kotor!).

Poin-poin kuat dari PyLint:

  • Laporan yang sangat deskriptif dan akurat.
  • Mendeteksi beberapa bau kode. Di sini ia mengatakan kepada saya untuk meninggalkan kelas saya untuk menulis sesuatu dengan fungsi karena pendekatan OO tidak berguna dalam kasus khusus ini. Sesuatu yang saya tahu, tetapi tidak pernah berharap komputer memberi tahu saya :-p
  • Kode yang sepenuhnya dikoreksi berjalan lebih cepat (tidak ada kelas, tidak ada referensi yang mengikat ...).
  • Dibuat oleh tim Prancis. Oke, ini bukan nilai tambah untuk semua orang, tapi saya suka ;-)

Kekurangan dari PyLint:

  • Beberapa aturan sangat ketat. Saya tahu bahwa Anda dapat mengubahnya dan defaultnya adalah untuk mencocokkan PEP8, tetapi apakah merupakan kejahatan untuk menulis 'untuk x dalam seq'? Tampaknya ya karena Anda tidak dapat menulis nama variabel dengan kurang dari 3 huruf. Saya akan mengubahnya.
  • Sangat banyak bicara. Bersiaplah untuk menggunakan mata Anda.

Script dikoreksi (dengan string dokumen malas dan nama variabel):

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

EDIT:

Terima kasih kepada Rudiger Wolf, saya menemukan pep8yang melakukan persis seperti namanya: mencocokkan PEP8. Telah ditemukan beberapa sintaks no-no yang PyLint tidak. Tetapi PyLintmenemukan hal-hal yang tidak secara khusus terkait dengan PEP8 tetapi menarik. Kedua alat itu menarik dan saling melengkapi.

Akhirnya saya akan menggunakan keduanya karena ada sangat mudah untuk menginstal (melalui paket atau setuptools) dan teks keluaran sangat mudah untuk berantai.

Untuk memberi Anda sedikit gambaran tentang hasil mereka:

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    |=          |
+-------------------------+------+---------+-----------+
e-satis
sumber
18
Tujuan dari pyflakes adalah menganalisis kode Anda secara statis untuk memastikan tidak ada kesalahan nama atau variabel / impor yang tidak digunakan.
culebrón
4
Apakah saya salah atau tidak ada poin kuat / lemah untuk PyChecker atau PyFlakes?
Wernight
17
"Poin kuat: Laporan yang sangat deskriptif dan akurat." Laporan yang mana? Apakah bagian ini tentang semua alat atau hanya satu?
ijk
3
Aku penasaran. Saya sebelumnya menulis seluruh pro / kontra hanya tentang PyLint. Saya tidak tahu mengapa saya menulis dengan cara bodoh ini. Mabuk mungkin? Maaf kawan
e-satis
13
flake8 mencakup keduanya pyflakesdan pep8. Sangat menyarankannya daripada hanya menggunakan satu atau yang lain.
Ehtesh Choudhury
93

pep8 baru-baru ini ditambahkan ke PyPi.

  • pep8 - pemeriksa panduan gaya Python
  • pep8 adalah alat untuk memeriksa kode Python Anda terhadap beberapa konvensi gaya di PEP 8.

Sekarang sangat mudah untuk memeriksa kode Anda terhadap pep8.

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

Rudiger Wolf
sumber
57
Ada paket IMO yang lebih baik. flake8, menggabungkan keduanya dan menambah kompleksitas bersyarat, bekerja pada direktori dan umumnya bagus.
DinGODzilla
1
Berlari flake8untuk pertama kalinya mengajari saya bahwa saya terjun langsung ke proyek tanpa mengetahui bahwa Python lebih menyukai ruang karena suatu alasan. Saya harus menggunakan --ignore W191untuk membuat output bermanfaat.
cjm
3
Perhatikan bahwa versi terbaru pep8sekarang disebut pycodestyle; lihat pypi.org/project/pycodestyle @cjm: python sangat menyukai spasi karena itulah yang ditentukan oleh pedoman gaya. Ruang tidak selalu unggul, tetapi konsistensi di seluruh komunitas adalah keuntungan besar, dan komunitas telah memutuskan ruang, jadi lakukan itu.
Chris L. Barnes
Bagaimana cara terbaik mengkonfigurasi editor saya (baik BBEdit atau vim) untuk menggunakan spasi untuk Python dan tab untuk yang lainnya? Tampaknya (setidaknya untuk BBEdit) ini adalah pengaturan global.
cjm
1
@ cjm Dalam vim, Anda dapat melakukan :set et(kependekan expandtabs) dan kemudian :retabmengubah semua tab di buffer saat ini menjadi spasi. Hal ini juga mungkin berguna untuk mengatur ts=4 sts=4 sw=4( tabstop, softtabstop, shiftwidth) pertama. Sejauh pendekatan umum, saya lebih suka menggunakan editorconfig.org dan pluginsnya untuk mengatur pengaturan yang tepat dalam sebuah repo, jadi Anda tidak perlu khawatir tentang mengkonfigurasi ulang editor Anda untuk basis kode yang berbeda.
codermonkeyfuel