IT story

Django와 함께 Pylint 사용하기

hot-time 2020. 6. 25. 07:53
반응형

Django와 함께 Pylint 사용하기


나는 통합하는 것이 매우처럼 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 코드에서 시작되었습니다.로드 / 호출하는 소스가 아닙니다.


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

pip install pylint-django

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

--load-plugins pylint_django

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


나는 다음을 사용한다 : pylint --generated-members=objects


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

행복한 날들!


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

pip install pylint-django

그리고 VSC 설정에 추가하십시오 :

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

django-lint is a nice tool which wraps pylint with django specific settings : http://chris-lamb.co.uk/projects/django-lint/

github project: https://github.com/lamby/django-lint


Because of how pylint works (it examines the source itself, without letting Python actually execute it) it's very hard for pylint to figure out how metaclasses and complex baseclasses actually affect a class and its instances. The 'pychecker' tool is a bit better in this regard, because it does actually let Python execute the code; it imports the modules and examines the resulting objects. However, that approach has other problems, because it does actually let Python execute the code :-)

You could extend pylint to teach it about the magic Django uses, or to make it understand metaclasses or complex baseclasses better, or to just ignore such cases after detecting one or more features it doesn't quite understand. I don't think it would be particularly easy. You can also just tell pylint to not warn about these things, through special comments in the source, command-line options or a .pylintrc file.


I resigned from using pylint/pychecker in favor of using pyflakes with Django code - it just tries to import module and reports any problem it finds, like unused imports or uninitialized local names.


This is not a solution, but you can add objects = models.Manager() to your Django models without changing any behavior.

I myself only use pyflakes, primarily due to some dumb defaults in pylint and laziness on my part (not wanting to look up how to change the defaults).


Try running pylint with

pylint --ignored-classes=Tags

If that works, add all the other Django classes - possibly using a script, in say, python :P

The documentation for --ignore-classes is:

--ignored-classes=<members names>
List of classes names for which member attributes should not be checked (useful for classes with attributes dynamicaly set). [current: %default]

I should add this is not a particular elegant solution in my view, but it should work.


The solution proposed in this other question it to simply add get_attr to your Tag class. Ugly, but works.


So far I have found no real solution to that but work around:

  • In our company we require a pylint score > 8. This allows coding practices pylint doesn't understand while ensuring that the code isn't too "unusual". So far we havn't seen any instance where E1101 kept us from reaching a score of 8 or higher.
  • Our 'make check' targets filter out "for has no 'objects' member" messages to remove most of the distraction caused by pylint not understanding Django.

For neovim & vim8 use w0rp's ale plugin. If you have installed everything correctly including w0rp's ale, pylint & pylint-django. In your vimrc add the following line & have fun developing web apps using django. Thanks.

let g:ale_python_pylint_options = '--load-plugins pylint_django'

  1. Go to settings in VSC by pressing Ctrl + ,
  2. Press Ctrl + Shift + p , type Python: Select Linter
  3. Select mypy from dropdown
  4. Install mypy if prompted.

참고URL : https://stackoverflow.com/questions/115977/using-pylint-with-django

반응형