Использование Pylint с Django - PullRequest
       155

Использование Pylint с Django

128 голосов
/ 22 сентября 2008

Я бы очень хотел интегрировать 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, поэтому подозреваю, что это не «просто» поле класса. С другой стороны, я довольно новичок в python так что я вполне мог что-то упустить из виду.)

Редактировать: Единственный способ сообщить pylint, что он не должен предупреждать об этих предупреждениях, - это заблокировать все ошибки типа (E1101), что не является приемлемым решением, поскольку это (в мое мнение) крайне полезная ошибка. Если есть другой способ, не увеличивая источник Pylint, пожалуйста, укажите мне на детали:)

См. здесь для краткого описания проблем, с которыми я столкнулся с pychecker и pyflakes - они оказались весьма нестабильными для общего использования. (В случае с pychecker, сбои возникли в коде pychecker - не исходный код, который он загружал / вызывал.)

Ответы [ 13 ]

134 голосов
/ 23 июня 2015

Не отключайте и не ослабляйте функциональность Pylint, добавляя ignores или generated-members.
Используйте активно разработанный плагин Pylint, который понимает Django.
Этот плагин Pylint для Django работает довольно хорошо:

pip install pylint-django

и при запуске pylint добавить в команду следующий флаг:

--load-plugins pylint_django

Подробное сообщение в блоге здесь .

63 голосов
/ 13 сентября 2009

Я использую следующее: pylint --generated-members=objects

30 голосов
/ 12 ноября 2010

Мой ~ / .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).

Счастливых дней!

19 голосов
/ 16 марта 2010

django-lint - хороший инструмент, который упаковывает pylint с настройками, специфичными для django: http://chris -lamb.co.uk / projects / django-lint /

GitHub проекта: https://github.com/lamby/django-lint

16 голосов
/ 12 декабря 2017

Если вы используете Visual Studio Code, сделайте следующее:

pip install pylint-django

И добавить в VSC config:

"python.linting.pylintArgs": [
    "--load-plugins=pylint_django"
],
16 голосов
/ 22 сентября 2008

Из-за того, как работает pylint (он проверяет сам источник, не позволяя Python фактически его выполнить), pylint очень трудно понять, как метаклассы и сложные базовые классы действительно влияют на класс и его экземпляры. Инструмент 'pychecker' немного лучше в этом отношении, потому что он действительно фактически позволяет Python выполнять код; он импортирует модули и проверяет полученные объекты. Однако у этого подхода есть другие проблемы, потому что он действительно позволяет Python выполнить код: -)

Вы можете расширить pylint, чтобы рассказать ему о волшебстве, используемом Django, или чтобы лучше понять метаклассы или сложные базовые классы, или просто игнорировать такие случаи после обнаружения одной или нескольких функций, которые он не совсем понимает. Я не думаю, что это будет особенно легко. Вы также можете просто сказать Pylint не предупреждать об этом, используя специальные комментарии в источнике, параметры командной строки или файл .pylintrc.

7 голосов
/ 23 сентября 2008

Это не решение, но вы можете добавить objects = models.Manager() к своим моделям Django без изменения поведения.

Я сам использую только pyflakes, в основном из-за каких-то тупых значений по умолчанию в pylint и лени с моей стороны (не желая искать, как изменить значения по умолчанию).

7 голосов
/ 23 сентября 2008

Я отказался от использования pylint / pychecker в пользу использования pyflakes с кодом Django - он просто пытается импортировать модуль и сообщает о любой обнаруженной проблеме, такой как неиспользованный импорт или неинициализированные локальные имена.

5 голосов
/ 22 сентября 2008

Попробуйте запустить Pylint с

pylint --ignored-classes=Tags

Если это работает, добавьте все остальные классы Django - возможно, используя скрипт, скажем, python: P

Документация для --ignore-classes:

--ignored-classes=<members names>
Список имен классов, для которых член атрибуты не должны проверяться (полезно для классов с атрибутами динамически устанавливается). [текущий:% по умолчанию]

Я должен добавить, что это не очень элегантное решение, на мой взгляд, но оно должно работать.

3 голосов
/ 24 февраля 2011

Решение, предложенное в этом другом вопросе - просто добавить get_attr в ваш класс Tag Некрасиво, но работает.

...