Django와 함께 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
객체와 같은 필드를 적절하게 고려하기 위해 어떻게 Pylint를 조정할 수 있습니까?(Django 소스도 알아봤지만, 구현체를 찾을 수 없었습니다.objects
그래서 저는 그것이 "그냥" 수업장이 아니라고 의심합니다.반면에, 저는 파이썬에 상당히 익숙하지 않기 때문에 무언가를 간과했을 가능성이 높습니다.)
편집: 제가 이러한 경고에 대해 경고하지 말라고 타일렀던 유일한 방법은 허용되지 않는 유형(E1101)의 모든 오류를 차단하는 것입니다. 왜냐하면 그것은 (제 생각에는) 매우 유용한 오류이기 때문입니다.만약 다른 방법이 있다면, pylint 소스를 보강하지 않고, 구체적으로 알려주세요 :)
제가 겪은 문제에 대한 요약을 보려면 여기를 참조하십시오.pychecker
그리고.pyflakes
일반적으로 사용하기에는 너무 불안정한 것으로 입증되었습니다. (pychecker의 경우, 충돌은 로드/호출 소스가 아닌 pychecker 코드에서 발생했습니다.)
기능을 비활성화하거나 약화시키지 .ignores
또는generated-members
.
장고를 이해할 수 있는 적극적으로 개발된 Pylint 플러그인을 사용합니다.
이 장고용 Pylint 플러그인은 매우 잘 작동합니다.
pip install pylint-django
그리고 pylint를 실행할 때 다음 플래그를 명령에 추가합니다.
--load-plugins pylint_django
자세한 블로그 게시물은 여기에 있습니다.
합니다.pylint --generated-members=objects
Visual Studio Code를 사용하는 경우 다음 작업을 수행합니다.
pip install pylint-django
VSC 구성에 추가:
"python.linting.pylintArgs": [
"--load-plugins=pylint_django"
],
내 ~/.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행).
행복한 날들!
django-message는 django별 설정으로 pylint를 감싸는 좋은 도구입니다. http://chris-lamb.co.uk/projects/django-lint/
github 프로젝트: https://github.com/lamby/django-lint
Python이 실제로 실행하지 않고 소스 자체를 검사하는 Python의 작동 방식 때문에 메타 클래스와 복잡한 기본 클래스가 실제로 클래스와 해당 인스턴스에 어떤 영향을 미치는지 파악하는 것은 Pylint에게 매우 어렵습니다.Pychecker' 도구는 Python이 실제로 코드를 실행할 수 있도록 해주기 때문에 이 점에서 조금 더 낫습니다. 모듈을 가져오고 결과 개체를 검사합니다.하지만 그 접근 방식은 실제로 Python이 코드를 실행할 수 있도록 하기 때문에 다른 문제가 있습니다 :-
당신은 장고가 사용하는 마법에 대해 가르치거나 메타 클래스나 복잡한 기본 클래스를 더 잘 이해하도록 하기 위해 또는 그것이 잘 이해하지 못하는 하나 이상의 기능을 감지한 후 그러한 경우를 무시하기 위해 프로파일링을 확장할 수 있습니다.특별히 쉽지는 않을 것 같습니다.소스, 명령줄 옵션 또는 .pylintrc 파일의 특수 주석을 통해 이러한 사항에 대해 경고하지 않도록 pylint에 지시할 수도 있습니다.
저는 장고 코드와 함께 파이플레이크를 사용하는 것을 찬성하여 pylint/pychecker 사용을 그만두었습니다. 모듈을 가져오려고 시도하고 사용되지 않은 가져오기 또는 초기화되지 않은 로컬 이름과 같은 문제를 보고합니다.
, 이은해아추수가있다습니할을 할 수 .objects = models.Manager()
동작을 변경하지 않고 장고 모델에 적용할 수 있습니다.
나 자신은 주로 타일링의 멍청한 기본값과 게으름(기본값을 바꾸는 방법을 찾고 싶지 않음) 때문에 파이플레이크만 사용합니다.
다음을 사용하여 pylint 실행해 보십시오.
pylint --ignored-classes=Tags
만약 그것이 효과가 있다면, 다른 모든 장고 클래스를 추가하세요 - 아마도 스크립트, 예를 들어 python :P를 사용합니다.
에 대한 --ignore-classes
다음과 같습니다.
--ignored-classes=<members names>
구성원 특성을 검사하지 않아야 하는 클래스 이름 목록입니다(다이나믹하게 설정된 속성을 가진 클래스에 유용). %파일: %default]
제가 보기에 이것은 특별한 우아한 해결책은 아니지만, 효과가 있을 것이라고 덧붙여야 합니다.
위해서neovim & vim8
사용하다w0rp's ale
를 포함한 모든 을 올바르게 한 경우w0rp's ale
,pylint
&pylint-django
의 신의에서.vimrc
다음 줄을 추가하고 장고를 사용하여 웹 앱을 개발하는 것을 즐기십시오.감사해요.
let g:ale_python_pylint_options = '--load-plugins pylint_django'
이 다른 질문에서 제안한 솔루션은 단순히 태그 클래스에 get_attr을 추가하는 것입니다.못생겼지만 효과가 있습니다.
지금까지 저는 이에 대한 실질적인 해결책을 찾지 못했지만 해결책은 다음과 같습니다.
- 우리 회사에서는 8점 이상의 파일린트 점수가 필요합니다.이를 통해 코드가 너무 "비정상적"이지 않도록 하는 동시에 pylint가 이해하지 못하는 코딩 관행을 허용합니다.지금까지 E1101이 8점 이상의 점수를 얻지 못한 사례는 없었습니다.
- 우리의 'make check' 대상은 "for have 'objects' member" 메시지를 필터링하여 장고를 이해하지 못해 발생하는 대부분의 주의 산만함을 제거합니다.
herku 사용자의 경우 다음 구문을 사용하여 이 질문에 대한 Tal Weiss의 답변을 사용하여 pylint-django 플러그인으로 pylint를 실행할 수도 있습니다(교체).timekeeping
앱/패키지 포함):
# run on the entire timekeeping app/package
heroku local:run pylint --load-plugins pylint_django timekeeping
# run on the module timekeeping/report.py
heroku local:run pylint --load-plugins pylint_django timekeeping/report.py
# With temporary command line disables
heroku local:run pylint --disable=invalid-name,missing-function-docstring --load-plugins pylint_django timekeeping/report.py
참고: 프로젝트/패키지 디렉터리를 지정하지 않고 실행할 수 없습니다.
문제가 있는 경우E5110: Django was not configured.
또한 다음과 같이 호출하여 해결을 시도할 수 있습니다(다시, 변경).timekeeping
앱/패키지로):
heroku local:run python manage.py shell -c 'from pylint import lint; lint.Run(args=["--load-plugins", "pylint_django", "timekeeping"])'
# With temporary command line disables, specific module
heroku local:run python manage.py shell -c 'from pylint import lint; lint.Run(args=["--load-plugins", "pylint_django", "--disable=invalid-name,missing-function-docstring", "timekeeping/report.py"])'
언급URL : https://stackoverflow.com/questions/115977/using-pylint-with-django
'programing' 카테고리의 다른 글
이미지를 PIL에서 개방형 CV 형식으로 변환 (0) | 2023.07.19 |
---|---|
컬러 리소스에서 컬러 인트를 얻으려면 어떻게 해야 합니까? (0) | 2023.07.19 |
TypeScript - [후속 속성 선언은 동일한 유형이어야 함] - 동일한 유형 정의에 대한 다중 참조 (0) | 2023.07.19 |
문자열에서 선행 및 후행 공백을 제거하는 방법은 무엇입니까? (0) | 2023.07.19 |
Excel 프레임을 읽을 때 특정 열 집합 건너뛰기 - 팬더 (0) | 2023.07.19 |