Django와 함께 Pylint 사용


140

나는 통합하는 것이 매우처럼 pylint을 내 파이썬 프로젝트의 빌드 프로세스에,하지만 난 하나의 쇼 스토퍼로 실행 한 : 나는 매우 useful-- 찾을 수있는 오류 유형 중 하나 : E1101: *%s %r has no %r member*일반 장고 필드를 사용하는 경우 --constantly 오류를보고 예를 들면 다음과 같습니다.

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를 조정하여 객체와 같은 필드를 올바르게 고려하려면 어떻게해야합니까? (또한 장고 소스를 살펴본 결과 구현을 찾을 수 없으므로 objects클래스 필드가 "단지"하지 않은 것 같습니다. 반면에 저는 파이썬에 익숙하지 않습니다. 잘 간과했을 수도 있습니다.)

편집 : 이 경고에 대해 경고하지 않도록 pylint에 알리는 유일한 방법은 유형 (E1101)의 모든 오류를 차단하는 것입니다.이 방법은 용인 할 수없는 솔루션입니다. Pylint 소스를 늘리지 않고 다른 방법이 있으면 구체적으로 알려주십시오. :)

참조 여기에 내가 함께 했어 문제에 대한 요약 pycheckerpyflakes- 그들이 일반적으로 사용하기 위해 지금까지 불안정을 입증했습니다. pychecker의 경우 충돌은 pychecker 코드에서 시작되었습니다.로드 / 호출하는 소스가 아닙니다.


4
최신 답변은 @talweiss의 게시물을 참조하십시오!
Brendan


1
@talweiss의 답변을 받아 들일 수 있습니까? 가장 최신의 올바른 솔루션입니다.
Vijay Varadan

답변:


155

비활성화하지 마십시오 또는 추가하여 Pylint 기능을 약화 ignoresgenerated-members. Django
이해 하는 활발하게 개발 된 Pylint 플러그인을 사용하십시오 .
이 Django 용 Pylint 플러그인 은 매우 잘 작동합니다 :

pip install pylint-django

pylint를 실행할 때 다음 플래그를 명령에 추가하십시오.

--load-plugins pylint_django

자세한 블로그 게시물은 여기 입니다.


2
블로그 게시물에 대한 링크가 곧 종료되었습니다. 다음은 인터넷 아카이브archive.is
Christian Long

3
Sublime Text의 SublimeLinter 플러그인과 함께 작동하려면 --load-plugins=pylint_djangolinters / pylint / args 설정 에 추가 해야했습니다. '='기호는 참고가 없으면 작동하지 않습니다.
Dennis Golomazov

작동하지 않습니다. 이 오류가 발생합니다. E : 8, 0 : 'django.db'모듈에 이름 'models'가 없습니다 (모듈 내 이름 없음)
max

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


TYPECHECK 아래의 man pylint (1)--generated-members=<members names> pylint 추론 시스템에 의해 동적으로 설정되고 누락 된 멤버 목록이므로 액세스 할 때 E0201 및 E1101을 트리거하지 않아야합니다 . [현재 : REQUEST, acl_users, aq_parent]
Mark Mikofski

PyDev / PyLint 섹션의 환경 설정에서 Eclipse의 PyDev에 이것을 추가합니다 .
Mark Mikofski

2
생성 된 멤버를 사용하면 이러한 오류가 숨겨 지지만 잘못된 개체의 개체 필드에 액세스하려고하면 여전히 오류가 발생할 수 있습니다. 대신 pylint-django 플러그인을 사용하십시오.
Vajk Hermecz

5
이것은 일부 기능을 비활성화하여 Pylint를 수정하는 잘못된 방법입니다. Django 를 이해 하는 Pylint 플러그인을 설치하기 만하면 됩니다. 참조 stackoverflow.com/a/31000713/78234
탈 와이즈

31

~ / .pylintrc에 포함 된 내용

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

마지막 두 가지는 장고 전용입니다.

이 있습니다 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 행).

행복한 날들!


pylint에 패치를 관리자에게 다시 제출해야합니다.
slacy

실제로 그들은이 패치를 0.24에 포함 시켰지만, shlex패키지를 사용하기 시작했고 다른 것을 깨뜨 렸습니다. 나는 gen.wordchars += "[]-+"그것을 작동시키기 위해 135 행 에 추가해야 했다.
simon

4
생성 된 멤버를 사용하면 이러한 오류가 숨겨 지지만 잘못된 개체의 '개체'필드에 액세스하려고하면 여전히 오류가 발생할 수 있습니다. 대신 pylint-django 플러그인을 사용하십시오.
Vajk Hermecz

4
이것은 일부 기능을 비활성화하여 Pylint를 수정하는 잘못된 방법입니다. Django 를 이해 하는 Pylint 플러그인을 설치하기 만하면 됩니다. 참조 stackoverflow.com/a/31000713/78234
탈 와이즈

3
@TalWeiss – 공정성에서이 답변은보다 세 살이 pylint-django
simon

27

Visual Studio Code를 사용하는 경우 다음을 수행하십시오.

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 관련 pylint의 아이디어가 마음에 들지만 지난 번 시도했을 때 큰 버그가있는 것 같습니다.
Wernight

3
또한 PyPI를 통해 사용할 수 없으며 웹 사이트에서 다음과 같은 충분한 정보를 제공하지 않는 것 같습니다. 현재 버전은 무엇입니까?
Wernight

1
나는 개념을 좋아하지만,이 구현은 절반 만 가능하며, 적당한 크기의 코드베이스를 깨뜨린 다. 실제로 유용하기 전에 갈 길이 멀다.
Cerin

1
@ gurney alex, 링크가 죽었습니다.
shuttle87

2
pylint-django가 더 활성화 된 것처럼 보이며, 이것이 권장되는 솔루션이어야합니다.
Vajk Hermecz

16

pylint의 작동 방식 (파이썬이 실제로 실행하지 않고 소스 자체를 검사 함) 때문에 pylint가 메타 클래스와 복잡한 기본 클래스가 실제로 클래스와 인스턴스에 어떤 영향을 미치는지 파악하기가 매우 어렵습니다. 이 때문에 'pychecker'도구는, 조금 더 나은이 점에서이다 않습니다 실제로 파이썬 코드를 실행하자; 모듈을 가져 와서 결과 객체를 검사합니다. 그러나이 접근법은 실제로 파이썬이 코드를 실행하게하기 때문에 다른 문제가 있습니다 :-)

Pylint를 확장하여 Django가 사용하는 마법에 대해 가르치거나 메타 클래스 또는 복잡한 기본 클래스를 더 잘 이해하거나 이해하지 못하는 하나 이상의 기능을 감지 한 후 그러한 경우를 무시할 수 있습니다. 나는 그것이 특히 쉬운 것이라고 생각하지 않습니다. 소스, 명령 행 옵션 또는 .pylintrc 파일의 특수 주석을 통해 pylint에 이러한 사항에 대해 경고하지 않도록 지시 할 수도 있습니다.


3
Django에 대해 Pylint를 가르치는 것은 쉽지 않지만 완료되었습니다 . Django 를 이해 하는 Pylint 플러그인을 설치하기 만하면 됩니다.
Tal Weiss

글쎄, 그것을 설치했지만 여전히 QuerySet이 제거되지 않은 것처럼 얇은 부분에 대해 compins ...
Eino Mäkitalo

7

Django 코드와 함께 pyflakes를 사용하기 위해 pylint / pychecker를 사용하지 않았습니다. 모듈 가져 오기를 시도하고 사용하지 않은 가져 오기 또는 초기화되지 않은 로컬 이름과 같이 발견 된 문제를보고합니다.


흥미 롭습니다-나는 pyflakes에 또 다른 모습을 줄 것입니다.
rcreswick


1
Pylint를 포기할 필요가 없습니다-Django를 이해 하는 Pylint 플러그인을 설치하기 만하면 됩니다. 참조 stackoverflow.com/a/31000713/78234
탈 와이즈

7

이것은 해결책이 아니지만 objects = models.Manager()동작을 변경하지 않고 장고 모델에 추가 할 수 있습니다 .

필자는 필레 핀 만 사용하는데, 주로 필레 인트 (Pylint)와 게으름의 일부 벙어리 기본값 (기본값 변경 방법을 찾지 않으려는) 때문입니다.


아 ... 팁 주셔서 감사합니다. django 소스의 로컬 사본에서 Model.models에 추가하여 시도하는지 확인할 수 있습니다.
rcreswick

나는 이것이 경고에서 타협하지 않기 때문에 훌륭한 해결책이라고 생각합니다.
Tom Leys

1
이것은 나쁜 해결책입니다. 불완전한 QA 도구를 수정하기 위해 자신을 반복하고 실행 가능한 것을 교체하면 나중에 변경됩니다 (따라서 QA 문제 발생)?
크리스 모건

2
나는 이것을 나쁜 해결책이라고 부르지 않을 것이다. 명시 적이 암시 적보다 낫다. 아마 objects마술 어쨌든 추가 할 수 없습니다.
Will Hardy

1
필자는 장고를 패치하여 Pylint를 수정하는 잘못된 방법이라고 생각합니다. Django 를 이해 하는 Pylint 플러그인을 설치하기 만하면 됩니다. 참조 stackoverflow.com/a/31000713/78234
탈 와이즈

5

다음과 같이 pylint를 실행 해보십시오

pylint --ignored-classes=Tags

그것이 작동하면 다른 모든 장고 클래스를 추가하십시오-아마도 파이썬을 사용하는 스크립트를 사용하십시오 : P

설명서 --ignore-classes는 다음과 같습니다.

--ignored-classes=<members names>
멤버 속성을 확인하지 않아야하는 클래스 이름 목록 (동적 분석 세트가있는 클래스에 유용). [현재 : % default]

나는 이것이 내 관점에서 특히 우아한 해결책은 아니지만 추가해야한다고 생각한다.


해당 클래스에서 오류가 발생하지 않는 경우에만 작동합니다.). 가능한 경우 코드를 무시하지 않기를 원합니다. 코드베이스의 다른 부분이 다른 정도의 조사를 분석하는 것이 매우 나쁜 생각이라고 생각합니다. 나는 어느 것이 어느 것인지 잊고 디버깅 할 때 잘못된 가정을 할 것이다
rcreswick

1
이것은 일부 기능을 비활성화하여 Pylint를 수정하는 잘못된 방법입니다. Django 를 이해 하는 Pylint 플러그인을 설치하기 만하면 됩니다. 참조 stackoverflow.com/a/31000713/78234
탈 와이즈

3

다른 질문 에서 제안한 해결책은 단순히 Tag 클래스에 get_attr 을 추가 하는 것입니다. 추악하지만 작동합니다.


1

지금까지 나는 그것에 대한 실제 해결책을 찾지 못했지만 해결 방법 :

  • 우리 회사에서는 pylint 점수> 8이 필요합니다. 이것은 코딩 관례를 허용합니다. pylint는 코드가 너무 "비정상적"이 아닌지 확인하면서 이해하지 못합니다. 지금까지 우리는 E1101이 8 점 이상의 점수에 도달하지 못하게 한 사례를 보지 못했습니다.
  • 우리의 'make check'타겟은 Django를 이해하지 못하는 pylint에 의한 대부분의 방해 요소를 제거하기 위해 "for ''objects 'member"메시지를 걸러냅니다.

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.