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

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

см. сообщение @ talweiss для получения актуального ответа!

Brendan 02.09.2015 21:45

Нашел хорошее решение на stackoverflow.com/a/31000713/78234

shahjapan 19.11.2015 17:00

Не могли бы вы принять ответ @talweiss? Это самое актуальное и правильное решение.

Vijay Varadan 19.02.2017 06:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
145
3
51 499
12

Ответы 12

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

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

Научить Pylint работе с Django непросто, но это было сделано: все, что вам нужно сделать, это установить плагин Pylint, который понимает Django. См. stackoverflow.com/a/31000713/78234

Tal Weiss 23.06.2015 14:18

Ну, я установил его, но он все еще жалуется на такие вещи, как QuerySet, который не удаляется ...

Eino Mäkitalo 18.06.2018 17:26

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

pylint --ignored-classes=Tags

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

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

--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]

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

Это работает, только если я никогда не делаю ошибок в этих классах;). Я хочу избегать игнорирования кода, если это вообще возможно - я думаю, что это очень плохая идея, чтобы разные части кодовой базы анализировались с разной степенью тщательности. Я забуду, что есть что, и сделаю ложные предположения при отладке

rcreswick 22.09.2008 20:55

Это неправильный способ исправить Pylint - отключив некоторые его функции. Все, что вам нужно сделать, это установить плагин Pylint, который понимает Django. См. stackoverflow.com/a/31000713/78234

Tal Weiss 23.06.2015 14:22

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

интересно - еще раз посмотрю на пифлейк.

rcreswick 23.09.2008 02:04

PyChecker ловит гораздо меньше, чем pylint. doughellmann.com/articles/CompletelyDifferent-2008-03-linter‌ s /…

Justin Abrahms 07.11.2009 00:02

Не нужно отказываться от Pylint - все, что вам нужно сделать, это установить плагин Pylint, который понимает Django. См. stackoverflow.com/a/31000713/78234

Tal Weiss 23.06.2015 14:21

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

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

Ах ... спасибо за подсказку. Я могу попробовать просто добавить это в Model.models в локальную копию источника django и посмотреть, поможет ли это.

rcreswick 23.09.2008 21:19

Я думаю, что это отличное решение, потому что оно не снижает предупреждений.

Tom Leys 22.03.2009 03:20

Это решение Плохо. Повторение и замена того, что возможно, изменится позже (что приведет к возникновению проблемы контроля качества), просто чтобы исправить неполный инструмент контроля качества?

Chris Morgan 11.06.2012 17:20

Я бы не назвал это плохим решением: явное лучше, чем неявное. Возможно, objects все равно не стоит добавлять волшебным образом.

Will Hardy 30.04.2013 17:18

Я думаю, что это неправильный способ исправить Pylint - в некотором смысле исправляя Django. Все, что вам нужно сделать, это установить плагин Pylint, который понимает Django. См. stackoverflow.com/a/31000713/78234

Tal Weiss 23.06.2015 14:20

Пока я не нашел реального решения для этого, но работаю:

  • В нашей компании требуется пиллинт оценка> 8. Это позволяет кодировать практикует pylint не понимает при этом гарантируя, что код не тоже "необычно". Пока мы не видели любой случай, когда нас задержал E1101 от достижения 8 баллов или выше.
  • Наши цели проверки отфильтровать "для не имеет" объектов " "член", чтобы удалить большую часть отвлечение, вызванное пилинтом, не понимание Django.

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

пилинт человек (1) under TYPECHECK --generated-members=<members names> List of members which are set dynamically and missed by pylint inference system, and so shouldn't trigger E0201 и E1101 when accessed. [current: REQUEST,acl_users,aq_parent]
Mark Mikofski 02.05.2012 10:14

Я добавляю это в PyDev в eclipse под предпочтения в разделе PyDev / PyLint.

Mark Mikofski 02.05.2012 10:21

Использование сгенерированных членов просто скрывает эти ошибки от вас, все еще могут быть ошибки при попытке доступа к полю объектов на неправильном объекте. Вместо этого используйте плагин pylint-django.

Vajk Hermecz 12.02.2015 16:16

Это неправильный способ исправить Pylint - отключив некоторые его функции. Все, что вам нужно сделать, это установить плагин Pylint, который понимает Django. См. stackoverflow.com/a/31000713/78234

Tal Weiss 23.06.2015 13:50

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

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

Мне нравится идея pylint, специфичного для Django, но в прошлый раз, когда я ее пробовал, она показалась мне большой ошибкой.

Wernight 21.07.2010 02:23

Кроме того, он недоступен через PyPI, и на веб-сайте, похоже, недостаточно информации, например: Какая текущая версия?

Wernight 21.07.2010 02:32

Мне нравится эта концепция, но эта реализация является лишь наполовину готовой и не подходит для любой кодовой базы среднего размера. Ему предстоит пройти долгий путь, прежде чем он станет действительно полезным.

Cerin 17.08.2011 18:59

django-lint? это довольно интересно. Я посмотрю на это

juliomalegria 07.12.2011 09:53

@gurney alex, линк мертв.

shuttle87 19.01.2015 04:33

Похоже, что pylint-django сейчас более активен, это должно быть рекомендуемым решением.

Vajk Hermecz 12.02.2015 16:18

Ссылка не работает, и репо на Github не трогали уже 3 года. Для активного решения и плагина Pylint, который понимает Django. См. stackoverflow.com/a/31000713/78234

Tal Weiss 23.06.2015 14:16

Мой ~ / .pylintrc содержит

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

последние два предназначены специально для Django.

Обратите внимание, что есть ошибка в 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 17.06.2011 22:51

на самом деле они включили этот патч в 0.24, но они начали использовать пакет shlex и сломали кое-что еще. Мне пришлось добавить gen.wordchars += "[]-+" в строке 135, чтобы заставить его работать ...

simon 02.10.2011 01:01

Использование сгенерированных членов просто скрывает эти ошибки от вас, все еще могут быть ошибки при попытке доступа к полю «объекты» на неправильном объекте. Вместо этого используйте плагин pylint-django.

Vajk Hermecz 12.02.2015 16:17

Это неправильный способ исправить Pylint - отключив некоторые его функции. Все, что вам нужно сделать, это установить плагин Pylint, который понимает Django. См. stackoverflow.com/a/31000713/78234

Tal Weiss 23.06.2015 13:50

@TalWeiss - честно говоря, этот ответ на три года старше, чем pylint-django, поэтому отрицательный голос немного резок ...

simon 24.06.2015 23:08

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

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

pip install pylint-django

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

--load-plugins pylint_django

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

Ссылка на сообщение в блоге мертва (так скоро). Вот несколько заархивированных ссылок из Интернет-архив и из archive.is

Christian Long 23.09.2015 19:06

Чтобы он работал с плагином SublimeLinter Sublime Text, мне пришлось добавить --load-plugins=pylint_django в настройку linters / pylint / args. Обратите внимание на знак «=», без него ничего не получилось.

Dennis Golomazov 19.11.2015 16:32

это не работает. Я получаю эту ошибку: E: 8, 0: Нет имени 'models' в модуле 'django.db' (no-name-in-module)

max 07.12.2015 20:02

@max Какая у вас полная командная строка? Версии Django и pylint? Полный вывод pylint run?

Tal Weiss 08.12.2015 21:11

django 1.8 pylint == 1.4.3 pylint-django == 0.7.1 Я не думаю, что здесь уместно помещать stacktrace ...

max 09.12.2015 01:48

При использовании django 1.9, pylint 1.5.2 и pylint-django 0.7.1 плагин pylint_django не отображал models.Manager.get как допустимый метод.

kzh 08.01.2016 18:49

Можете ли вы привести пример того, как я бы использовал его в проекте Django? pylint --load-plugins pylint_django (как мне здесь обратиться к моему проекту Django?)

caliph 16.03.2016 16:41

Вы также можете добавить это в свой pylintrc: [MASTER] load-plugins=pylint_django

azmeuk 14.06.2016 18:13

В коде vs это не сработает для меня, пока я не введу в пользовательские настройки следующее: {"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],}tieuminh2510 ответ

ali-myousefi 14.07.2019 09:16

@azmeuk Спасибо! Заголовок раздела разобраться не смог! Почему МАСТЕР? Где это задокументировано? Как мне узнать в следующий раз, как должны выглядеть формат и разделы .pylintrc?

cammil 03.12.2020 15:07

Честно говоря, не могу вспомнить, где это нашел :(

azmeuk 03.12.2020 16:56

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

pip install pylint-django

И добавляем в конфиг VSC:

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

Лучший ответ на сегодняшний день: D

serfer2 10.09.2019 15:19

Для neovim & vim8 используйте плагин w0rp's ale. Если вы установили все правильно, включая w0rp's ale, pylint и pylint-django. В вашем vimrc добавьте следующую строку и получайте удовольствие от разработки веб-приложений с помощью django. Спасибо.

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

действительно работал идеально для меня, на купленных vim и neovim, спасибо.

Flavio Oliveira 19.08.2020 11:59

Другие вопросы по теме