Django के साथ Pylint का उपयोग करना


140

मैं अपने अजगर परियोजनाओं के लिए निर्माण की प्रक्रिया में pylint को एकीकृत करना बहुत पसंद करूंगा , लेकिन मैं एक शो-स्टॉपर में चला गया हूं: उन त्रुटि प्रकारों में से एक जो मुझे बहुत उपयोगी लगते हैं--: - E1101: *%s %r has no %r member*आम djp फ़ील्ड का उपयोग करते समय अचानक त्रुटियों की रिपोर्ट करता है , उदाहरण के लिए:

E1101:125:get_user_tags: Class 'Tag' has no 'objects' member

जो इस कोड के कारण होता है:

def get_user_tags(username):
   """
   Gets all the tags that username has used.

   Returns a query set.
   """
   return Tag.objects.filter(  ## This line triggers the error.
       tagownership__users__username__exact=username).distinct()

# Here is the Tag class, models.Model is provided by Django:
class Tag(models.Model):
   """
   Model for user-defined strings that help categorize Events on
   on a per-user basis.
   """
   name = models.CharField(max_length=500, null=False, unique=True)

   def __unicode__(self):
       return self.name

मैं Pylint को कैसे ठीक से फ़ील्ड में ले जा सकता हूँ जैसे कि वस्तुओं को ध्यान में रखते हुए? (मैं भी Django स्रोत में देखा है, और मैं के कार्यान्वयन को खोजने में असमर्थ रहा है objects, इसलिए मुझे संदेह है कि यह "सिर्फ" एक वर्ग क्षेत्र नहीं है। दूसरी ओर, मैं अजगर के लिए काफी नया हूं, इसलिए मैं बहुत अच्छी तरह से कुछ की अनदेखी की है।)

संपादित करें: मैंने इन चेतावनियों के बारे में चेतावनी नहीं देने के लिए पाइलिंट को बताने का एकमात्र तरीका टाइप (E1101) की सभी त्रुटियों को रोक दिया है, जो एक स्वीकार्य समाधान नहीं है, क्योंकि वह (मेरी राय में) एक अत्यंत उपयोगी त्रुटि है। अगर वहाँ एक और तरीका है, pylint स्रोत बढ़ाने के बिना, कृपया मुझे बारीकियों को इंगित करें :)

समस्याओं के सारांश के लिए यहाँ देखें pycheckerऔर pyflakes- वे सामान्य उपयोग के लिए अस्थिर साबित हुए हैं। (Pychecker के मामले में, क्रैश की उत्पत्ति pychecker कोड में हुई थी - स्रोत नहीं जो इसे लोड कर रहा था / चालान कर रहा था।)


4
अप-टू-डेट जवाब के लिए @ talweiss की पोस्ट देखें!
ब्रेंडन

पर मिले अच्छा समाधान stackoverflow.com/a/31000713/78234
shahjapan

1
क्या आप कृपया @talweiss के उत्तर को स्वीकार कर सकते हैं? यह सबसे अद्यतित और सही समाधान है।
विजय वरदान

जवाबों:


155

जोड़कर ignoresया पाइलिंट कार्यक्षमता को कमजोर या कमजोर न करें generated-members
एक सक्रिय रूप से विकसित Pylint प्लगइन का उपयोग करें जो Django को समझता है
Django के लिए यह Pylint प्लगइन काफी अच्छी तरह से काम करता है:

pip install pylint-django

और पाइलिंट चलाते समय कमांड में निम्न ध्वज जोड़ें:

--load-plugins pylint_django

विस्तृत ब्लॉग पोस्ट यहाँ


2
ब्लॉग पोस्ट का लिंक मर चुका है (इतनी जल्दी)। यहाँ से कुछ संग्रहीत लिंक हैं इंटरनेट का संग्रह और से archive.is
ईसाई लांग

3
इसे Sublime Text के SublimeLinter प्लगइन के साथ काम करने के लिए, मुझे --load-plugins=pylint_djangolinters / pylint / togs सेटिंग में जोड़ना था । '=' चिह्न पर ध्यान दें, यह इसके बिना काम नहीं करता था।
डेनिस गोलोमेज़ोव

यह काम नहीं करता। मुझे यह त्रुटि मिलती है: E: 8, 0: मॉड्यूल 'django.db' (नो-नेम-इन-मॉड्यूल) में कोई नाम 'मॉडल' नहीं है
अधिकतम

6
आप इसे अपने pylintrc में भी जोड़ सकते हैं:[MASTER] load-plugins=pylint_django
azmeuk

3
बनाम कोड में यह मेरे लिए तब तक काम नहीं करता जब तक मैं उपयोगकर्ता सेटिंग्स में निम्नलिखित नहीं {"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],} डालता
अलि-मयूज़फी

63

मैं निम्नलिखित का उपयोग करता हूं: pylint --generated-members=objects


TYPECHECK के अंतर्गत मैन पाइलिंट (1)--generated-members=<members names> सदस्यों की सूची जो गतिशील रूप से सेट की जाती हैं और पाइलिंट इंट्रेंस सिस्टम द्वारा चूक जाती हैं, और इसलिए एक्सेस होने पर E0201 और E1101 को ट्रिगर नहीं करना चाहिए । [current: REQUEST, acl_users, aq_parent]
मार्क मिकोफ़्स्की


2
जनरेट किए गए सदस्यों का उपयोग करना इन त्रुटियों को आपसे छिपाता है, फिर भी गलत ऑब्जेक्ट पर ऑब्जेक्ट फ़ील्ड तक पहुंचने का प्रयास करते समय त्रुटियां हो सकती हैं। इसके बजाय pylint-django plugin का उपयोग करें।
वाजक हर्मीज़

5
यह पाइलिंट को ठीक करने का गलत तरीका है - इसकी कुछ कार्यक्षमता को अक्षम करके। तुम सब करने की ज़रूरत है एक Pylint प्लगइन स्थापित करता है जो Django को समझता है । देखें stackoverflow.com/a/31000713/78234
Tal Weiss

31

मेरा ~ / .pylintrc सम्‍मिलित है

[TYPECHECK]
generated-members=REQUEST,acl_users,aq_parent,objects,_meta,id

अंतिम दो विशेष रूप से Django के लिए हैं।

ध्यान दें कि PyLint 0.21.1 में एक बग है जिसे इस काम को बनाने के लिए पैचिंग की आवश्यकता है।

संपादित करें: यह थोड़ा और अधिक के साथ खिलवाड़ करने के बाद, मैंने PyLint को हैक करने का निर्णय लिया, ताकि मुझे उपरोक्त का विस्तार करने की अनुमति मिल सके।

[TYPECHECK]
generated-members=REQUEST,acl_users,aq_parent,objects,_meta,id,[a-zA-Z]+_set

मैंने बस जोड़ा:

    import re
    for pattern in self.config.generated_members:
        if re.match(pattern, node.attrname):
            return

बग रिपोर्ट में उल्लिखित फिक्स के बाद (यानी, लाइन 129 पर)।

खुशी के दिन!


आपको अपने पैच को बनाए रखने के लिए पाइलिंट को वापस प्रस्तुत करना चाहिए।
18

वास्तव में उन्होंने इस पैच को 0.24 में शामिल किया है, लेकिन उन्होंने shlexपैकेज का उपयोग करना शुरू कर दिया है, और अब कुछ और तोड़ दिया है। मुझे gen.wordchars += "[]-+"काम करने के लिए 135 लाइन पर जोड़ना पड़ा ...
सिमोन

4
जनरेट किए गए सदस्यों का उपयोग करना इन त्रुटियों को आपसे छिपाता है, गलत ऑब्जेक्ट पर 'ऑब्जेक्ट्स' फ़ील्ड तक पहुँचने का प्रयास करते समय अभी भी त्रुटियाँ हो सकती हैं। इसके बजाय pylint-django plugin का उपयोग करें।
वाजेक हर्मेज़

4
यह पाइलिंट को ठीक करने का गलत तरीका है - इसकी कुछ कार्यक्षमता को अक्षम करके। तुम सब करने की ज़रूरत है एक Pylint प्लगइन स्थापित करता है जो Django को समझता है । देखें stackoverflow.com/a/31000713/78234
Tal Weiss

3
@ टैलिसिस - निष्पक्षता में, यह उत्तर तीन साल से अधिक पुराना है pylint-django, इसलिए चढ़ाव थोड़ा कठोर है ...
सिमोन

27

यदि आप Visual Studio कोड का उपयोग करते हैं, तो यह करें:

pip install pylint-django

और VSC विन्यास में जोड़ें:

"python.linting.pylintArgs": [
    "--load-plugins=pylint_django"
],

2
अब तक की सर्वश्रेष्ठ प्रतिक्रिया: D
serfer2

19

django-lint एक अच्छा उपकरण है जो django विशिष्ट सेटिंग्स के साथ pylint को लपेटता है: http://chris-lamb.co.uk/projects/django-lint/

github प्रोजेक्ट: https://github.com/lamby/django-lint


1
मुझे एक Django- विशिष्ट पाइलिंट का विचार पसंद है, लेकिन ऐसा लगता है कि पिछली बार जब मैंने इसे आजमाया था तो एक बड़ा बगिया था।
वर्नट

3
इसके अलावा यह PyPI के माध्यम से उपलब्ध नहीं है और वेबसाइट पर्याप्त जानकारी नहीं देती है जैसे: वर्तमान संस्करण क्या है?
वर्नट

1
मुझे अवधारणा पसंद है, लेकिन यह कार्यान्वयन केवल आधा-बेक्ड है, और किसी भी मामूली आकार के कोडबेस पर टूट जाता है। यह वास्तविक उपयोगी होने से पहले एक लंबा रास्ता तय करना है।
सेरिन

1
@gurney एलेक्स, लिंक मर चुका है।
शटल87

2
लगता है कि पाइलिन्ट-डजैंगो अब अधिक सक्रिय है, जिसे सलाह दी जानी चाहिए।
वाजेक हर्मेज़

16

क्योंकि पाइलिंट कैसे काम करता है (यह स्वयं स्रोत की जांच करता है, पायथन को वास्तव में इसे निष्पादित किए बिना) पाइलिन्ट के लिए यह पता लगाना बहुत मुश्किल है कि मेटाक्लासेस और जटिल बेसक्लस वास्तव में एक वर्ग और उसके उदाहरणों को कैसे प्रभावित करते हैं। क्योंकि यह 'pychecker' उपकरण, इस संबंध में एक सा बेहतर है करता है वास्तव में अजगर कोड निष्पादित करते हैं; यह मॉड्यूल आयात करता है और परिणामी वस्तुओं की जांच करता है। हालाँकि, उस दृष्टिकोण में अन्य समस्याएं हैं, क्योंकि यह वास्तव में पायथन को कोड निष्पादित करने देता है :-)

आप इसे जादू Django उपयोगों के बारे में सिखाने के लिए, या इसे मेटाकालेज़ या जटिल बेसकैप्स को बेहतर तरीके से समझने के लिए या केवल एक या अधिक विशेषताओं का पता लगाने के बाद ऐसे मामलों को अनदेखा करने के लिए पाइलिंट का विस्तार कर सकते हैं। मुझे नहीं लगता कि यह विशेष रूप से आसान होगा। आप केवल इन चीजों के बारे में चेतावनी नहीं देने के लिए pylint को बता सकते हैं, स्रोत में विशेष टिप्पणियों के माध्यम से, कमांड-लाइन विकल्प या एक .pylintrc फ़ाइल।


3
जिआंगो के बारे में पाइलिंट को पढ़ाना आसान नहीं है, लेकिन यह किया गया है: आपको केवल एक पाइलिंट प्लगइन स्थापित करना होगा जो Django को समझता है । देखें stackoverflow.com/a/31000713/78234
Tal Weiss

वैसे मैंने इसे स्थापित किया है, लेकिन यह अभी भी इस तरह के बारे में सवाल करता है जैसे QuerySet का कोई निष्कासन नहीं है ...
Eino Mäkitalo

7

मैंने Django कोड के साथ pyflakes का उपयोग करने के पक्ष में pylint / pychecker का उपयोग करने से इस्तीफा दे दिया - यह सिर्फ मॉड्यूल आयात करने की कोशिश करता है और किसी भी समस्या का पता लगाता है, जैसे अप्रयुक्त आयात या अनधिकृत स्थानीय नाम।


दिलचस्प - मैं pyflakes को एक और रूप दूंगा।
rcreswick

2
PyChecker pylint की तुलना में बहुत कम पकड़ता है। doughellmann.com/articles/CompletelyDifferent-2008-03-linters/…
जस्टिन

1
Pylint को छोड़ने की कोई आवश्यकता नहीं है - आपको केवल एक Pylint प्लगइन स्थापित करना होगा जो Django को समझता है । देखें stackoverflow.com/a/31000713/78234
Tal Weiss

7

यह कोई समाधान नहीं है, लेकिन आप objects = models.Manager()किसी भी व्यवहार को बदले बिना अपने Django मॉडल में जोड़ सकते हैं ।

मैं खुद केवल पाइफ्लेक्स का उपयोग करता हूं, मुख्य रूप से मेरे हिस्से पर पाइलिंट और आलस्य में कुछ गूंगा चूक के कारण (चूक को कैसे बदलना है, यह नहीं देखना चाहता)।


आह ... टिप के लिए धन्यवाद। मैं सिर्फ django स्रोत की स्थानीय प्रति में Model.models को जोड़ने की कोशिश कर सकता हूं और यह देख सकता हूं कि क्या यह करता है।
rcreswick

मुझे लगता है कि यह एक महान समाधान है क्योंकि यह चेतावनियों पर समझौता नहीं करता है।
टॉम लेयस

1
यह एक बुरा उपाय है। अपने आप को दोहराते हुए और कुछ को बदलने के लिए जो कि संभव है, बाद में बदल जाएगा (इस प्रकार क्यू समस्या का परिचय), बस एक अधूरा क्यूए उपकरण को ठीक करने के लिए?
क्रिस मॉर्गन

2
मैं इसे एक बुरा समाधान नहीं कहूंगा: स्पष्ट रूप से निहित से बेहतर है। शायद objectsजादुई रूप से वैसे भी नहीं जोड़ा जाना चाहिए।
हार्डी

1
मुझे लगता है कि यह पाइलिंट को ठीक करने का गलत तरीका है - एक अर्थ में Django को पैच करके। तुम सब करने की ज़रूरत है एक Pylint प्लगइन स्थापित करता है जो Django को समझता है । देखें stackoverflow.com/a/31000713/78234
Tal Weiss

5

साथ चल पाइलिंट की कोशिश करो

pylint --ignored-classes=Tags

यदि वह काम करता है, तो अन्य सभी Django वर्गों को जोड़ दें - संभवतः स्क्रिप्ट का उपयोग करते हुए, कहें: अजगर: पी

के लिए प्रलेखन --ignore-classesहै:

--ignored-classes=<members names>
उन वर्गों के नामों की सूची, जिनके लिए सदस्य विशेषताओं की जाँच नहीं की जानी चाहिए (गुण गतिकी सेट के साथ कक्षाओं के लिए उपयोगी)। [वर्तमान:% डिफ़ॉल्ट]

मुझे यह जोड़ना चाहिए कि मेरे विचार में यह कोई विशेष सुरुचिपूर्ण समाधान नहीं है, लेकिन यह काम करना चाहिए।


यह केवल तभी काम करता है जब मैं उन कक्षाओं में कभी कोई त्रुटि नहीं करता;) यदि संभव हो तो मैं कोड की अनदेखी से बचना चाहता हूं - मुझे लगता है कि कोडबेस के अलग-अलग हिस्सों का एक अलग डिग्री की जांच का विश्लेषण करना बहुत बुरा विचार है। मैं भूल
जाऊंगा

1
यह पाइलिंट को ठीक करने का गलत तरीका है - इसकी कुछ कार्यक्षमता को अक्षम करके। तुम सब करने की ज़रूरत है एक Pylint प्लगइन स्थापित करता है जो Django को समझता है । देखें stackoverflow.com/a/31000713/78234
Tal Weiss

3

इस अन्य प्रश्न में प्रस्तावित समाधान इसे केवल अपने टैग वर्ग में get_attr जोड़ते हैं । बदसूरत, लेकिन काम करता है।


1

अब तक मुझे इसका कोई वास्तविक समाधान नहीं मिला है, लेकिन इसके आसपास काम करते हैं:

  • हमारी कंपनी में हमें एक पाइलट स्कोर की आवश्यकता है। 8. यह कोडिंग प्रथाओं को समझने की अनुमति देता है, जबकि यह सुनिश्चित करना कि कोड "असामान्य" नहीं है। अब तक हमने ऐसा कोई उदाहरण नहीं देखा है जहां E1101 ने हमें 8 या अधिक के स्कोर तक पहुंचने से रोक दिया हो।
  • जाइलो को नहीं समझने वाले पाइलिंट की वजह से होने वाली अधिकांश व्याकुलता को दूर करने के लिए हमारे 'मेक चेक' टारगेट फ़िल्टर आउट 'में कोई' ऑब्जेक्ट्स 'मेंबर' संदेश नहीं है।

0

के लिए neovim & vim8उपयोग w0rp's aleप्लगइन। तुम सब कुछ सही ढंग से स्थापित किया है सहित w0rp's ale, pylintऔर pylint-django। अपने vimrcऐड में निम्नलिखित पंक्ति और django का उपयोग करके वेब एप्लिकेशन विकसित करने का मज़ा लें। धन्यवाद।

let g:ale_python_pylint_options = '--load-plugins pylint_django'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.