ใช้ Pylint กับ Django


140

ฉันอยากจะรวมpylintเข้ากับกระบวนการสร้างสำหรับโครงการ python ของฉัน แต่ฉันได้ใช้ในการแสดงครั้งเดียว: หนึ่งในประเภทข้อผิดพลาดที่ฉันพบว่ามีประโยชน์มาก -: - 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

ฉันจะปรับ Pylint ให้ใช้ฟิลด์เช่นวัตถุอย่างถูกต้องได้อย่างไร (ฉันได้ดูที่แหล่ง Django แล้วและฉันไม่สามารถหาวิธีการใช้งานได้objectsดังนั้นฉันจึงสงสัยว่ามันไม่ใช่ "เพียง" คลาสของสนามในทางกลับกันฉันค่อนข้างใหม่กับไพ ธ อนดังนั้นฉันจึง อาจจะมองข้ามบางสิ่งได้เป็นอย่างดี)

แก้ไข:วิธีเดียวที่ฉันพบว่าบอกให้ไพลีนไม่เตือนเกี่ยวกับคำเตือนเหล่านี้คือการปิดกั้นข้อผิดพลาดทั้งหมดของประเภท (E1101) ซึ่งไม่ใช่วิธีการแก้ปัญหาที่ยอมรับได้เนื่องจากเป็นข้อผิดพลาดที่มีประโยชน์มาก หากมีวิธีอื่นโดยไม่ต้องเพิ่มแหล่งไพลินโปรดชี้ให้ฉันเจาะจง :)

ดูที่นี่สำหรับบทสรุปของปัญหาที่ฉันเคยมีpycheckerและpyflakes- พวกเขาได้พิสูจน์ให้เป็นที่อยู่ไกลออกไปไม่แน่นอนสำหรับการใช้งานทั่วไป (ในกรณีของพิชเคอเรเตอร์ความผิดพลาดเกิดขึ้นในรหัสพิชเคอเรเตอร์ - ไม่ใช่แหล่งที่มาซึ่งเป็นการโหลด / เรียกใช้)


4
ดูโพสต์ของ @ talweiss สำหรับคำตอบล่าสุด!
เบรนแดน

พบทางออกที่ดีที่stackoverflow.com/a/31000713/78234
shahjapan

1
คุณช่วยตอบรับคำตอบของ @talweiss ได้ไหม? มันเป็นโซลูชั่นที่ทันสมัยและถูกต้องที่สุด
Vijay Varadan

คำตอบ:


155

ไม่ปิดหรือลดลงการทำงาน pylint โดยการเพิ่มหรือignores ใช้ปลั๊กอิน Pylint ที่พัฒนาขึ้นอย่างจริงจังที่เข้าใจ Django ปลั๊กอิน Pylint สำหรับ Django ใช้งานได้ดี:generated-members

pip install pylint-django

และเมื่อรัน pylint ให้เพิ่มค่าสถานะต่อไปนี้ในคำสั่ง:

--load-plugins pylint_django

บล็อกโพสต์รายละเอียดที่นี่


2
ลิงก์ไปยังโพสต์บล็อกนั้นตายแล้ว (เร็ว ๆ นี้) นี่คือลิงค์ที่เก็บถาวรจากInternet Archiveและจากarchive.is
Christian Long

3
เพื่อให้มันทำงานกับปลั๊กอิน SublimeLinter ของ Sublime Text ฉันต้องเพิ่ม--load-plugins=pylint_djangoการตั้งค่า linters / pylint / args สังเกตเครื่องหมาย '=' มันไม่ทำงานหากไม่มี
Dennis Golomazov

มันไม่ทำงาน. ฉันได้รับข้อผิดพลาดนี้: E: 8, 0: ไม่มีชื่อ 'รุ่น' ในโมดูล 'django.db' (ไม่มีชื่อในโมดูล)
สูงสุด

6
คุณยังสามารถเพิ่มสิ่งนี้ลงใน pylintrc ของคุณ:[MASTER] load-plugins=pylint_django
azmeuk

3
ในรหัส vs ปริมาณไม่ทำงานสำหรับฉันจนกว่าฉันจะใส่ในต่อไปนี้ในการตั้งค่าผู้ใช้: {"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],} คำตอบของ tieuminh2510
ali-myousefi

63

ฉันใช้สิ่งต่อไปนี้: pylint --generated-members=objects


man pylint (1)ภายใต้ TYPECHECK --generated-members=<members names>รายชื่อสมาชิกที่ตั้งค่าแบบไดนามิกและพลาดโดยระบบการอนุมาน pylint และดังนั้นไม่ควรเปิดใช้ E0201 และ E1101เมื่อเข้าถึง [current: REQUEST, acl_users, aq_parent]
Mark Mikofski

ฉันจะเพิ่มใน PyDev ในคราสภายใต้การตั้งค่าในส่วน PyDev / PyLint
Mark Mikofski

2
ใช้สมาชิกสร้างขึ้นเพียงซ่อนข้อผิดพลาดเหล่านี้จากคุณยังคงมีข้อผิดพลาดเมื่อพยายามเข้าถึงฟิลด์วัตถุบนวัตถุที่ผิด ใช้ปลั๊กอิน pylint-django แทน
Vajk Hermecz

5
นี่เป็นวิธีที่ผิดพลาดในการแก้ไข Pylint โดยการปิดการใช้งานฟังก์ชั่นบางอย่าง สิ่งที่คุณต้องทำคือติดตั้งปลั๊กอิน Pylint ที่เข้าใจ Django ดูstackoverflow.com/a/31000713/78234
Tal Weiss

31

My ~ / .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)

วันแห่งความสุข!


คุณควรส่งแพตช์เพื่อไพลินกลับไปที่ผู้ดูแล
slacy

จริงๆแล้วพวกเขารวมแพตช์นี้ไว้ใน 0.24 แต่พวกเขาเริ่มใช้shlexแพ็คเกจและแตกอย่างอื่นตอนนี้ ฉันต้องเพิ่มgen.wordchars += "[]-+"ที่บรรทัดที่ 135 เพื่อให้มันทำงาน ...
simon

4
ใช้สมาชิกสร้างขึ้นเพียงซ่อนข้อผิดพลาดเหล่านี้จากคุณยังอาจมีข้อผิดพลาดเมื่อพยายามเข้าถึงฟิลด์ 'วัตถุ' บนวัตถุที่ผิด ใช้ปลั๊กอิน pylint-django แทน
Vajk Hermecz

4
นี่เป็นวิธีที่ผิดพลาดในการแก้ไข Pylint โดยการปิดการใช้งานฟังก์ชั่นบางอย่าง สิ่งที่คุณต้องทำคือติดตั้งปลั๊กอิน Pylint ที่เข้าใจ Django ดูstackoverflow.com/a/31000713/78234
Tal Weiss

3
@TalWeiss - โดยความเป็นธรรมคำตอบนี้เก่ากว่าสามปีpylint-djangoดังนั้น downvote นั้นค่อนข้างรุนแรง ...
simon

27

หากคุณใช้ Visual Studio Code ให้ทำสิ่งนี้:

pip install pylint-django

และเพิ่มการกำหนดค่า VSC:

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

2
คำตอบที่ดีที่สุดโดยไกล: D
serfer2

19

django-lint เป็นเครื่องมือที่ดีที่จะห่อ pylint ด้วยการตั้งค่าเฉพาะของ django: http://chris-lamb.co.uk/projects/django-lint/

โครงการ github: https://github.com/lamby/django-lint


1
ฉันชอบไอเดียของ pylint เฉพาะของ Django แต่ดูเหมือนว่าครั้งใหญ่ที่ฉันจะลอง
Wernight

3
นอกจากนี้ยังไม่พร้อมใช้งานผ่าน PyPI และเว็บไซต์ดูเหมือนจะไม่ให้ข้อมูลมากพอเช่น: เวอร์ชันปัจจุบันคืออะไร
Wernight

1
ฉันชอบแนวคิดนี้ แต่การติดตั้งใช้งานเพียงครึ่งเดียวและหยุดพักกับฐานข้อมูลขนาดปานกลาง มันมีทางยาวไปก่อนที่มันจะมีประโยชน์จริง
Cerin

1
@ เกอร์นีย์อเล็กซ์, ลิงค์เสียชีวิต
รถรับส่ง 87

2
ดูเหมือนว่า pylint-django จะเปิดใช้งานมากขึ้นในตอนนี้ซึ่งควรเป็นคำแนะนำที่เหมาะสม
Vajk Hermecz

16

เนื่องจาก pylint ทำงานอย่างไร (มันตรวจสอบแหล่งที่มาเองโดยไม่ต้องให้ Python ทำงานจริง) มันยากมากที่ไพลินต์จะเข้าใจว่า metaclasses และ baseclasses ซับซ้อนส่งผลกระทบต่อคลาสและอินสแตนซ์ของมันอย่างไร 'การ pychecker' เครื่องมือเป็นบิตที่ดีขึ้นในเรื่องนี้เพราะมันไม่จริงให้งูหลามรันรหัส; มันนำเข้าโมดูลและตรวจสอบวัตถุที่เกิดขึ้น อย่างไรก็ตามวิธีการนั้นมีปัญหาอื่น ๆ เพราะจริง ๆ แล้วทำให้ Python ใช้งานโค้ด :-)

คุณสามารถขยายไพลินต์เพื่อสอนเกี่ยวกับการใช้เวทมนตร์ของ Django หรือเพื่อให้เข้าใจ metaclasses หรือ baseclasses ที่ซับซ้อนได้ดีขึ้นหรือเพียงแค่เพิกเฉยต่อกรณีดังกล่าวหลังจากตรวจสอบคุณสมบัติอย่างน้อยหนึ่งอย่างที่ไม่เข้าใจ ฉันไม่คิดว่ามันจะง่ายอย่างยิ่ง นอกจากนี้คุณยังสามารถบอก pylint เพื่อไม่เตือนเกี่ยวกับสิ่งเหล่านี้ผ่านความคิดเห็นพิเศษในซอร์สตัวเลือกบรรทัดคำสั่งหรือไฟล์. pylintrc


3
มันไม่ง่ายเลยที่จะสอน Pylint เกี่ยวกับ Django แต่ทำได้แล้ว: สิ่งที่คุณต้องทำคือติดตั้งปลั๊กอิน Pylint ที่เข้าใจ Django ดูstackoverflow.com/a/31000713/78234
Tal Weiss

ดีฉันติดตั้งมัน แต่มันยังคง compins เกี่ยวกับ thins เช่น QuerySet ไม่มีการลบ ...
Eino Mäkitalo

7

ฉันลาออกจากการใช้ pylint / pychecker เพื่อสนับสนุนการใช้ pyflakes ด้วยรหัส Django - เพียงพยายามนำเข้าโมดูลและรายงานปัญหาที่พบเช่นการอิมพอร์ตที่ไม่ได้ใช้หรือชื่อท้องถิ่นที่ไม่ได้กำหนดค่า


ที่น่าสนใจ - ฉันจะให้ pyflakes ดูอีกครั้ง
rcreswick

2
PyChecker จับได้น้อยกว่าไพลิน doughellmann.com/articles/CompletelyDifferent-2008-03-linters/ …
Justin Abrahms

1
ไม่ต้องยอมแพ้กับ Pylint - สิ่งที่คุณต้องทำคือติดตั้งปลั๊กอิน Pylint ที่เข้าใจ Django ดูstackoverflow.com/a/31000713/78234
Tal Weiss

7

นี่ไม่ใช่วิธีแก้ไขปัญหา แต่คุณสามารถเพิ่มลงobjects = models.Manager()ในโมเดล Django ของคุณได้โดยไม่ต้องเปลี่ยนพฤติกรรมใด ๆ

ตัวฉันเองใช้ pyflakes โดยเฉพาะอย่างยิ่งเนื่องจากค่าเริ่มต้นเป็นใบ้ใน pylint และความเกียจคร้านในส่วนของฉัน (ไม่ต้องการค้นหาวิธีเปลี่ยนค่าเริ่มต้น)


อ่า ... ขอบคุณสำหรับคำแนะนำ ฉันอาจลองเพิ่มมันเข้าไปใน Model.models ในสำเนาโลคัลของแหล่ง django และดูว่าทำได้หรือไม่
rcreswick

ฉันคิดว่านี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยมเพราะมันไม่กระทบต่อคำเตือน
Tom Leys

1
นี่เป็นทางออกที่ไม่ดี ทำซ้ำตัวเองและแทนที่สิ่งที่เป็นไปได้จะเปลี่ยนในภายหลัง (เช่นแนะนำปัญหา QA) เพียงเพื่อแก้ไขเครื่องมือ QA ที่ไม่สมบูรณ์?
Chris Morgan

2
ฉันจะไม่เรียกสิ่งนี้ว่าเป็นทางออกที่ไม่ดี: ชัดเจนดีกว่าโดยนัย อาจobjectsไม่ควรเพิ่มอย่างน่าอัศจรรย์
Will Hardy

1
ฉันคิดว่านี่เป็นวิธีที่ผิดในการแก้ไข Pylint - ด้วยการปรับปรุง Django ในแง่หนึ่ง สิ่งที่คุณต้องทำคือติดตั้งปลั๊กอิน Pylint ที่เข้าใจ Django ดูstackoverflow.com/a/31000713/78234
Tal Weiss

5

ลองใช้ pylint ด้วย

pylint --ignored-classes=Tags

ถ้าใช้งานได้ให้เพิ่มคลาส Django อื่นทั้งหมด - อาจใช้สคริปต์ในการใช้คำสั่ง python: P

เอกสารสำหรับ--ignore-classesคือ:

--ignored-classes=<members names>
รายการชื่อคลาสที่ไม่ควรตรวจสอบคุณสมบัติของสมาชิก (มีประโยชน์สำหรับคลาสที่มีชุดคุณสมบัติ dynamicaly) [ปัจจุบัน:% เริ่มต้น]

ฉันควรเพิ่มสิ่งนี้ไม่ใช่โซลูชันที่หรูหราในมุมมองของฉัน แต่ควรใช้งานได้


ใช้งานได้เฉพาะในกรณีที่ฉันไม่เคยทำผิดพลาดในชั้นเรียนเหล่านั้น;) ฉันต้องการหลีกเลี่ยงการเพิกเฉยโค้ดหากเป็นไปได้ - ฉันคิดว่าเป็นความคิดที่ดีมากที่จะให้ส่วนต่าง ๆ ของ codebase วิเคราะห์ระดับการตรวจสอบที่แตกต่างกัน ฉันจะลืมว่าอันไหนอยู่
ที่ไหน

1
นี่เป็นวิธีที่ผิดพลาดในการแก้ไข Pylint โดยการปิดการใช้งานฟังก์ชั่นบางอย่าง สิ่งที่คุณต้องทำคือติดตั้งปลั๊กอิน Pylint ที่เข้าใจ Django ดูstackoverflow.com/a/31000713/78234
Tal Weiss


1

จนถึงตอนนี้ฉันไม่พบวิธีแก้ปัญหาที่แท้จริง แต่ยังแก้ไข:

  • ใน บริษัท ของเราเราต้องการคะแนน pylint> 8 ซึ่งช่วยให้การเขียนโค้ด pylint ไม่เข้าใจในขณะที่มั่นใจได้ว่ารหัสไม่ได้ "ผิดปกติ" จนถึงตอนนี้เราไม่เห็นตัวอย่างใด ๆ ที่ E1101 ทำให้เราไม่สามารถเข้าถึงคะแนน 8 หรือสูงกว่าได้
  • กรอง 'ตรวจสอบเป้าหมาย' ของเราเป็น "เพราะไม่มีข้อความ" วัตถุ "สำหรับสมาชิกเพื่อลบสิ่งรบกวนส่วนใหญ่ที่เกิดจาก pylint ที่ไม่เข้าใจ Django

0

สำหรับการneovim & vim8ใช้งานw0rp's aleปลั๊กอิน หากคุณติดตั้งทุกอย่างถูกต้องรวมทั้งw0rp's ale, และpylint pylint-djangoในการvimrcเพิ่มบรรทัดต่อไปนี้ของคุณและสนุกกับการพัฒนาเว็บแอพโดยใช้ django ขอบคุณ

let g:ale_python_pylint_options = '--load-plugins pylint_django'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.