python - Django के साथ पिलिंट का उपयोग करना




static-analysis pylint (8)

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

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

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

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

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



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

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

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

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


मेरा ~ / .pylintrc शामिल है

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

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

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

संपादित करें: इसके साथ थोड़ा और गड़बड़ करने के बाद, मैंने मुझे ऊपर विस्तार करने की अनुमति देने के लिए केवल एक छोटा सा पिकलिंट हैक करने का फैसला किया:

[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

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

खुशी के दिन!


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


यदि आप विजुअल स्टूडियो कोड का उपयोग करते हैं तो यह करें:

pip install pylint-django

और वीएससी कॉन्फ़िगरेशन में जोड़ें:

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

साथ पिलिंट चलाने का प्रयास करें

pylint --ignored-classes=Tags

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

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

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

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


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

pip install pylint-django

और जब पिलिंट चल रहा है तो निम्न ध्वज को कमांड में जोड़ें:

--load-plugins pylint_django

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





pylint