Sử dụng Pylint với Django


140

Tôi rất muốn tích hợp pylint vào quá trình xây dựng cho các dự án python của mình, nhưng tôi đã chạy vào một trình chặn hiển thị: Một trong những loại lỗi mà tôi thấy cực kỳ hữu ích--: E1101: *%s %r has no %r member*- báo cáo lỗi thường xuyên khi sử dụng các trường django thông thường , ví dụ:

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

Điều này được gây ra bởi mã này:

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

Làm cách nào tôi có thể điều chỉnh Pylint để đưa các trường như đối tượng vào tài khoản đúng cách? (Tôi cũng đã tìm hiểu về nguồn Django và tôi không thể tìm thấy việc triển khai objects, vì vậy tôi nghi ngờ đó không phải là "chỉ" một trường lớp. Mặt khác, tôi khá mới với python, vì vậy tôi rất có thể đã bỏ qua một cái gì đó.)

Chỉnh sửa: Cách duy nhất tôi thấy để nói với pylint là không cảnh báo về những cảnh báo này là bằng cách chặn tất cả các lỗi thuộc loại (E1101) không phải là một giải pháp chấp nhận được, vì theo tôi (đó là một lỗi cực kỳ hữu ích. Nếu có một cách khác, mà không làm tăng nguồn pylint, xin vui lòng chỉ cho tôi chi tiết cụ thể :)

Xem ở đây để biết tóm tắt về các vấn đề tôi gặp phải pycheckerpyflakes- chúng đã được chứng minh là không ổn định khi sử dụng chung. (Trong trường hợp của pychecker, các sự cố bắt nguồn từ mã pychecker - không phải là nguồn mà nó đang tải / gọi.)


4
xem bài đăng của @ Talweiss để có câu trả lời cập nhật!
Brendan

Tìm thấy giải pháp tốt tại stackoverflow.com/a/31000713/78234
shahjapan

1
Bạn có thể vui lòng chấp nhận câu trả lời của @talweiss không? Đó là giải pháp cập nhật và chính xác nhất.
Vijay Varadan

Câu trả lời:


155

Không vô hiệu hóa hoặc làm suy yếu chức năng Pylint bằng cách thêm ignoreshoặc generated-members.
Sử dụng một plugin Pylint được phát triển tích cực để hiểu Django.
Plugin Pylint cho Django này hoạt động khá tốt:

pip install pylint-django

và khi chạy pylint, thêm cờ sau vào lệnh:

--load-plugins pylint_django

Bài viết chi tiết blog tại đây .


2
Liên kết đến bài viết trên blog đã chết (rất sớm). Dưới đây là một số liên kết lưu trữ từ Lưu trữ Internet và từ archive.is
Christian Long

3
Để làm cho nó hoạt động với plugin SublimeLinter của Sublime Text, tôi đã phải thêm --load-plugins=pylint_djangovào cài đặt linters / pylint / args. Lưu ý dấu '=', nó không hoạt động nếu không có nó.
Dennis Golomazov

nó không hoạt động. Tôi gặp lỗi này: E: 8, 0: Không có tên 'mô hình' trong mô-đun 'django.db' (không có tên trong mô-đun)
tối đa

6
Bạn cũng có thể thêm phần này vào pylintrc của mình:[MASTER] load-plugins=pylint_django
azmeuk

3
Trong mã vs, nó không có tác dụng với tôi cho đến khi tôi đặt vào phần sau trong cài đặt người dùng: {"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],} câu trả lời của tieuminh2510
ali-myousefi

63

Tôi sử dụng như sau: pylint --generated-members=objects


man pylint (1) trong TYPECHECK --generated-members=<members names>Danh sách các thành viên được thiết lập động và bỏ qua bởi hệ thống suy luận pylint, và vì vậy không nên kích hoạt E0201 và E1101 khi truy cập. [hiện tại: YÊU CẦU, acl_users, aq_parent]
Mark Mikofski

Tôi thêm cái này vào PyDev trong nhật thực theo sở thích trong phần PyDev / PyLint .
Đánh dấu Mikofski

2
Sử dụng các thành viên được tạo chỉ cần che giấu các lỗi này khỏi bạn, vẫn có thể có lỗi khi cố gắng truy cập vào trường đối tượng trên đối tượng sai. Sử dụng plugin pylint-django thay thế.
Vajk Hermecz

5
Đây là cách sai để sửa Pylint - bằng cách vô hiệu hóa một số chức năng của nó. Tất cả những gì bạn cần làm là cài đặt một plugin Pylint hiểu Django. Xem stackoverflow.com/a/31000713/78234
Tal Weiss

31

Của tôi ~ / .pylintrc

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

hai cái cuối cùng được dành riêng cho Django.

Lưu ý rằng có một lỗi trong PyLint 0.21.1 cần vá để thực hiện công việc này.

Chỉnh sửa: Sau khi loay hoay với điều này thêm một chút nữa, tôi quyết định hack PyLint chỉ một chút xíu để cho phép tôi mở rộng phần trên thành:

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

Tôi chỉ cần thêm:

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

sau khi sửa lỗi được đề cập trong báo cáo lỗi (ví dụ, tại dòng 129).

Những ngày hạnh phúc!


Bạn nên gửi bản vá của bạn để pylint trở lại cho các nhà bảo trì.
Slacy

thực tế họ đã bao gồm bản vá này trong 0,24, nhưng họ đã bắt đầu sử dụng shlexgói và đã phá vỡ một thứ khác bây giờ. Tôi đã phải thêm gen.wordchars += "[]-+"vào dòng 135 để nó hoạt động ...
simon

4
Sử dụng các thành viên được tạo chỉ cần che giấu các lỗi này khỏi bạn, vẫn có thể có lỗi khi cố truy cập vào trường 'đối tượng' trên đối tượng sai. Sử dụng plugin pylint-django thay thế.
Vajk Hermecz

4
Đây là cách sai để sửa Pylint - bằng cách vô hiệu hóa một số chức năng của nó. Tất cả những gì bạn cần làm là cài đặt một plugin Pylint hiểu Django. Xem stackoverflow.com/a/31000713/78234
Tal Weiss

3
@Talweiss - công bằng mà nói, câu trả lời này lớn hơn ba tuổi pylint-django, vì vậy downvote hơi khắc nghiệt ...
simon

27

Nếu bạn sử dụng Visual Studio Code, hãy làm điều này:

pip install pylint-django

Và thêm vào cấu hình VSC:

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

2
Phản hồi tốt nhất cho đến nay: D
serfer2

19

django-lint là một công cụ tuyệt vời bao bọc pylint với các cài đặt cụ thể của django: http://chris-lamb.co.uk/projects/django-lint/

dự án github: https://github.com/lamby/django-lint


1
Tôi thích ý tưởng về một pylint dành riêng cho Django, nhưng có vẻ như một lỗi lớn lần trước tôi đã thử nó.
Wernight

3
Ngoài ra, nó không có sẵn thông qua PyPI và trang web dường như không cung cấp đủ thông tin như: Phiên bản hiện tại là gì?
Wernight

1
Tôi thích khái niệm này, nhưng việc triển khai này chỉ được thực hiện một nửa và phá vỡ bất kỳ cơ sở mã hóa có kích thước vừa phải. Nó còn một chặng đường dài trước khi nó thực sự hữu ích.
Cerin

1
@gurney alex, Liên kết đã chết.
đưa đón87

2
Có vẻ như pylint-django hiện đang hoạt động nhiều hơn, đó nên là giải pháp được khuyên dùng.
Vajk Hermecz

16

Do cách thức hoạt động của pylint (nó tự kiểm tra nguồn, mà không để Python thực sự thực thi nó), rất khó để pylint tìm ra cách metaclass và baseclass phức tạp thực sự ảnh hưởng đến một lớp và các thể hiện của nó. Các công cụ 'pychecker' là một chút tốt hơn trong vấn đề này, bởi vì nó không thực sự cho phép thực thi mã Python; nó nhập các mô-đun và kiểm tra các đối tượng kết quả. Tuy nhiên, cách tiếp cận đó có các vấn đề khác, vì nó thực sự cho phép Python thực thi mã :-)

Bạn có thể mở rộng pylint để dạy cho nó về phép thuật mà Django sử dụng, hoặc để làm cho nó hiểu được siêu dữ liệu hoặc cơ sở phức tạp tốt hơn, hoặc bỏ qua những trường hợp như vậy sau khi phát hiện một hoặc nhiều tính năng mà nó không hiểu lắm. Tôi không nghĩ nó sẽ đặc biệt dễ dàng. Bạn cũng có thể chỉ cần nói với pylint để không cảnh báo về những điều này, thông qua các nhận xét đặc biệt trong nguồn, tùy chọn dòng lệnh hoặc tệp .pylintrc.


3
Thật không dễ để dạy Pylint về Django, nhưng nó đã được thực hiện: Tất cả những gì bạn cần làm là cài đặt một plugin Pylint hiểu Django. Xem stackoverflow.com/a/31000713/78234
Tal Weiss

Chà, tôi đã cài đặt nó nhưng nó vẫn bao gồm những thứ như Truy vấn không xóa được ...
Eino Mäkitalo

7

Tôi đã từ bỏ việc sử dụng pylint / pychecker để sử dụng pyflakes với mã Django - nó chỉ cố gắng nhập mô-đun và báo cáo bất kỳ vấn đề nào nó tìm thấy, như nhập khẩu không sử dụng hoặc tên địa phương chưa được khởi tạo.


thú vị - tôi sẽ cung cấp cho pyflakes một cái nhìn khác.
RCreswick

2
PyChecker bắt ít hơn nhiều so với pylint. doughellmann.com/articles/CompletelyDifferent-2008-03-linters/ khăn
Justin Abrahms

1
Không cần phải từ bỏ Pylint - Tất cả những gì bạn cần làm là cài đặt một plugin Pylint hiểu Django. Xem stackoverflow.com/a/31000713/78234
Tal Weiss

7

Đây không phải là một giải pháp, nhưng bạn có thể thêm objects = models.Manager()vào các mô hình Django của mình mà không thay đổi bất kỳ hành vi nào.

Bản thân tôi chỉ sử dụng pyflakes, chủ yếu là do một số mặc định ngu ngốc trong môn vị và sự lười biếng của tôi (không muốn tìm cách thay đổi mặc định).


À ... cảm ơn vì tiền boa. Tôi có thể thử chỉ thêm nó vào Model.models trong bản sao cục bộ của nguồn django và xem nếu nó làm điều đó.
RCreswick

Tôi nghĩ rằng đây là một giải pháp tuyệt vời vì nó không thỏa hiệp với các cảnh báo.
Tom Leys

1
Đây là một giải pháp tồi . Lặp lại chính mình và thay thế một cái gì đó khả thi sẽ thay đổi sau này (do đó giới thiệu một vấn đề QA), chỉ để khắc phục một công cụ QA không hoàn chỉnh?
Chris Morgan

2
Tôi sẽ không gọi đây là một giải pháp tồi: rõ ràng là tốt hơn ngầm định. Có lẽ objectskhông nên thêm phép thuật nào.
Will Hardy

1
Tôi nghĩ rằng đây là cách sai để sửa Pylint - bằng cách vá Django theo một nghĩa nào đó. Tất cả những gì bạn cần làm là cài đặt một plugin Pylint hiểu Django. Xem stackoverflow.com/a/31000713/78234
Tal Weiss

5

Hãy thử chạy pylint với

pylint --ignored-classes=Tags

Nếu nó hoạt động, hãy thêm tất cả các lớp Django khác - có thể sử dụng một tập lệnh, giả sử, python: P

Các tài liệu cho --ignore-classeslà:

--ignored-classes=<members names>
Danh sách các tên lớp mà các thuộc tính thành viên không nên được kiểm tra (hữu ích cho các lớp có tập động động thuộc tính). [hiện tại:% mặc định]

Tôi nên thêm rằng đây không phải là một giải pháp thanh lịch đặc biệt theo quan điểm của tôi, nhưng nó sẽ hoạt động.


Nó chỉ hoạt động nếu tôi không bao giờ mắc lỗi trong các lớp đó;). Tôi muốn tránh bỏ qua mã nếu có thể - tôi nghĩ rằng đó là một ý tưởng rất tồi khi có các phần khác nhau của cơ sở mã đã phân tích một mức độ xem xét khác nhau. Tôi sẽ quên cái nào là giả định và đưa ra các giả định sai khi gỡ lỗi
RCreswick

1
Đây là cách sai để sửa Pylint - bằng cách vô hiệu hóa một số chức năng của nó. Tất cả những gì bạn cần làm là cài đặt một plugin Pylint hiểu Django. Xem stackoverflow.com/a/31000713/78234
Tal Weiss

3

Giải pháp được đề xuất trong câu hỏi khác này là chỉ cần thêm get_attr vào lớp Tag của bạn. Xấu xí, nhưng hoạt động.


1

Cho đến nay tôi không tìm thấy giải pháp thực sự nào cho vấn đề đó ngoài việc giải quyết:

  • Trong công ty của chúng tôi, chúng tôi yêu cầu điểm số pylint> 8. Điều này cho phép thực hành mã hóa pylint không hiểu trong khi đảm bảo rằng mã không quá "bất thường". Cho đến nay chúng tôi không thấy bất kỳ trường hợp nào mà E1101 giữ cho chúng tôi đạt được điểm 8 hoặc cao hơn.
  • Các mục tiêu 'thực hiện kiểm tra' của chúng tôi lọc ra các thông báo "không có thành viên" đối tượng "để loại bỏ hầu hết các phiền nhiễu gây ra bởi việc không hiểu Django.

0

Để neovim & vim8sử dụng w0rp's aleplugin. Nếu bạn đã cài đặt mọi thứ chính xác bao gồm w0rp's ale, pylint& pylint-django. Trong vimrcdòng thêm của bạn và vui chơi phát triển ứng dụng web bằng django. Cảm ơn.

let g:ale_python_pylint_options = '--load-plugins pylint_django'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.