PyLint, PyChecker या PyFlakes? [बन्द है]


390

मैं इन उपकरणों पर कुछ प्रतिक्रिया प्राप्त करना चाहूंगा:

  • विशेषताएं;
  • अनुकूलन क्षमता;
  • उपयोग में आसानी और सीखने की अवस्था।

1
इसका क्या टैग मानक है?
साइलेंटगॉस्ट

2
क्योंकि आप PEP से मेल खाने के लिए इस टूल का उपयोग करते हैं, विशेष रूप से PEP 8 जो सभी अंतर्निहित पायथन मॉड्यूल के लिए मानक है।
ई-सतीस

और क्या आप इसे मैच के लिए अन्य peps चाहते हैं? क्योंकि pep-8 के लिए एक अस्पष्ट टैग stackoverflow.com/questions/tagged/pep8 है
SilentGhost

आप सही हैं, मैं पेप -8
ई-

1
क्या pep8 को विकल्प के रूप में शामिल करने के लिए शीर्षक को संपादित नहीं किया जाना चाहिए? सबसे पहले, मैंने सोचा था कि आप लोग प्रस्ताव के बारे में बात कर रहे थे, न कि एक वास्तविक PyPI पैकेज।
एहतेश चौधरी

जवाबों:


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माना जाता है कि यह लाइट है। दरअसल, यह तय किया कि कोड सही था। मुझे कुछ गंभीर लग रहा है इसलिए मुझे नहीं लगता कि मैं इसके लिए जाऊंगा।
  • PyLint बहुत बातूनी है और कोड 3/10 (OMG, मैं एक गंदा कोडर हूँ!) मूल्यांकन किया गया है।

के अंक PyLint:

  • बहुत वर्णनात्मक और सटीक रिपोर्ट।
  • कुछ कोड बदबू का पता लगाएं। यहाँ इसने मुझे अपनी कक्षा को कार्यों के साथ कुछ लिखने के लिए छोड़ने को कहा क्योंकि इस विशिष्ट मामले में OO दृष्टिकोण बेकार था। कुछ ऐसा जो मैं जानता था, लेकिन कभी उम्मीद नहीं की कंप्यूटर मुझे बताएगा :-p
  • पूरी तरह से सही कोड तेजी से चलता है (कोई वर्ग नहीं, कोई संदर्भ बंधन नहीं ...)।
  • एक फ्रांसीसी टीम द्वारा बनाया गया। ठीक है, यह हर किसी के लिए एक प्लस नहीं है, लेकिन मुझे यह पसंद है ;-)

की विपक्ष PyLint:

  • कुछ नियम वास्तव में सख्त हैं। मुझे पता है कि आप इसे बदल सकते हैं और यह कि डिफ़ॉल्ट पीईपी 8 से मेल खाता है, लेकिन क्या 'सी में एक्स के लिए ’लिखना ऐसा अपराध है? जाहिरा तौर पर हाँ क्योंकि आप 3 अक्षरों से कम के साथ एक चर नाम नहीं लिख सकते हैं। मैं उसे बदल दूंगा।
  • बहुत बहुत बातूनी। अपनी आंखों का उपयोग करने के लिए तैयार रहें।

सही स्क्रिप्ट (आलसी डॉक्टर तार और चर नामों के साथ):

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

संपादित करें:

रुडिगर वुल्फ के लिए धन्यवाद, मुझे पता चला pep8कि वास्तव में इसका नाम क्या है: PEP8 से मेल खाता है। यह कई वाक्यविन्यास संख्या में पाया गया है कि PyLint नहीं किया था। लेकिन ऐसा PyLintसामान मिला जो विशेष रूप से पीईपी 8 से जुड़ा नहीं था लेकिन दिलचस्प था। दोनों उपकरण दिलचस्प और पूरक हैं।

आखिरकार मैं दोनों का उपयोग करूँगा क्योंकि वास्तव में स्थापित करना आसान है (संकुल या सेटप्टूल के माध्यम से) और आउटपुट पाठ श्रृंखला के लिए इतना आसान है।

आपको उनके आउटपुट का थोड़ा विचार देने के लिए:

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 का उद्देश्य यह सुनिश्चित करने के लिए आपके कोड का विश्लेषण करना है कि कोई नाम त्रुटि या अप्रयुक्त चर / आयात नहीं होगा।
culbrón

4
क्या मुझे यह गलत लग रहा है या PyChecker और PyFlakes के लिए कोई मजबूत / कमजोर बिंदु नहीं है?
वेर्नेट

17
"स्ट्रॉन्ग पॉइंट्स: वेरी डिस्क्रिप्टिव एंड सटीक रिपोर्ट।" कौन सी रिपोर्ट? क्या यह अनुभाग सभी साधनों या सिर्फ एक के बारे में है?
ijk

3
मैं सोचता हूं। मैंने स्पष्ट रूप से पूरी समर्थक / con को केवल PyLint के बारे में लिखा है। मुझे कोई अंदाजा नहीं है कि मैंने इस मूर्खतापूर्ण तरीके से क्यों लिखा। हैंगओवर शायद? क्षमा करें दोस्तों।
ई-शनि

13
flake8 को शामिल किया गया दोनों pyflakesऔर pep8। केवल एक या दूसरे का उपयोग करके इसे दृढ़ता से सुझाव दें।
एहतेश चौधरी

93

pep8 को हाल ही में PyPi में जोड़ा गया था।

  • pep8 - पायथन स्टाइल गाइड चेकर
  • pep8 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 देखें : पायथन दृढ़ता से स्थान पसंद करता है क्योंकि वह वही है जो शैली दिशानिर्देशों द्वारा निर्दिष्ट है। रिक्त स्थान बेहतर नहीं हैं, लेकिन पूरे समुदाय में स्थिरता एक महान लाभ है, और समुदाय ने रिक्त स्थान पर फैसला किया है, इसलिए ऐसा करें।
क्रिस एल। बार्न्स

पायथन और टैब के लिए रिक्त स्थान का उपयोग करने के लिए मैं अपने संपादक (या तो BBEdit या vim) को कैसे कॉन्फ़िगर करूं? ऐसा लगता है कि (कम से कम BBEdit के लिए) यह एक वैश्विक सेटिंग है।
cjm

1
@ cjm vim में, आप कर सकते हैं :set et(छोटे के लिए expandtabs) और फिर :retabवर्तमान बफ़र में सभी टैब को रिक्त स्थान में बदलने के लिए। यह भी स्थापित करने के लिए उपयोगी हो सकता है ts=4 sts=4 sw=4( tabstop, softtabstop, shiftwidth) पहले। जहां तक ​​एक सामान्य दृष्टिकोण की बात है, तो मैं एक रेपो में सही सेटिंग्स सेट करने के लिए editorconfig.org और इसके प्लग इन का उपयोग करना पसंद करता हूं , इसलिए आपको विभिन्न कोडबेस के लिए अपने संपादक को पुन: कॉन्फ़िगर करने के बारे में चिंता करने की आवश्यकता नहीं है।
कोडरमोनकीफ्यूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.