Я бы очень хотел интегрировать пиллинт в процесс сборки для
мои проекты на 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, а не в источнике, который он загружал / вызывал.)
Нашел хорошее решение на stackoverflow.com/a/31000713/78234
Не могли бы вы принять ответ @talweiss? Это самое актуальное и правильное решение.






Из-за того, как работает pylint (он проверяет сам источник, не позволяя Python выполнять его на самом деле), pylint очень сложно понять, как метаклассы и сложные базовые классы на самом деле влияют на класс и его экземпляры. Инструмент pychecker в этом отношении немного лучше, потому что он делает фактически позволяет Python выполнять код; он импортирует модули и проверяет полученные объекты. Однако у этого подхода есть другие проблемы, потому что он действительно позволяет Python выполнять код :-)
Вы можете расширить pylint, чтобы научить его магии, которую использует Django, или чтобы он лучше понимал метаклассы или сложные базовые классы, или просто игнорировал такие случаи после обнаружения одной или нескольких функций, которые он не совсем понимает. Не думаю, что это будет особенно легко. Вы также можете просто указать pylint не предупреждать об этих вещах с помощью специальных комментариев в исходном коде, параметров командной строки или файла .pylintrc.
Научить Pylint работе с Django непросто, но это было сделано: все, что вам нужно сделать, это установить плагин Pylint, который понимает Django. См. stackoverflow.com/a/31000713/78234
Ну, я установил его, но он все еще жалуется на такие вещи, как QuerySet, который не удаляется ...
Попробуйте запустить 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]
Я должен добавить, что, на мой взгляд, это не особо элегантное решение, но оно должно работать.
Это работает, только если я никогда не делаю ошибок в этих классах;). Я хочу избегать игнорирования кода, если это вообще возможно - я думаю, что это очень плохая идея, чтобы разные части кодовой базы анализировались с разной степенью тщательности. Я забуду, что есть что, и сделаю ложные предположения при отладке
Это неправильный способ исправить Pylint - отключив некоторые его функции. Все, что вам нужно сделать, это установить плагин Pylint, который понимает Django. См. stackoverflow.com/a/31000713/78234
Я отказался от использования pylint / pychecker в пользу использования pyflakes с кодом Django - он просто пытается импортировать модуль и сообщает о любых обнаруженных проблемах, таких как неиспользуемый импорт или неинициализированные локальные имена.
интересно - еще раз посмотрю на пифлейк.
PyChecker ловит гораздо меньше, чем pylint. doughellmann.com/articles/CompletelyDifferent-2008-03-linter s /…
Не нужно отказываться от Pylint - все, что вам нужно сделать, это установить плагин Pylint, который понимает Django. См. stackoverflow.com/a/31000713/78234
Это не решение, но вы можете добавить objects = models.Manager() в свои модели Django, не меняя поведения.
Я сам использую только pyflakes, в первую очередь из-за некоторых глупых настроек по умолчанию в pylint и моей лени (не желая искать, как изменить настройки по умолчанию).
Ах ... спасибо за подсказку. Я могу попробовать просто добавить это в Model.models в локальную копию источника django и посмотреть, поможет ли это.
Я думаю, что это отличное решение, потому что оно не снижает предупреждений.
Это решение Плохо. Повторение и замена того, что возможно, изменится позже (что приведет к возникновению проблемы контроля качества), просто чтобы исправить неполный инструмент контроля качества?
Я бы не назвал это плохим решением: явное лучше, чем неявное. Возможно, objects все равно не стоит добавлять волшебным образом.
Я думаю, что это неправильный способ исправить Pylint - в некотором смысле исправляя Django. Все, что вам нужно сделать, это установить плагин Pylint, который понимает Django. См. stackoverflow.com/a/31000713/78234
Пока я не нашел реального решения для этого, но работаю:
Я использую следующее: pylint --generated-members=objects
--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]
Я добавляю это в PyDev в eclipse под предпочтения в разделе PyDev / PyLint.
Использование сгенерированных членов просто скрывает эти ошибки от вас, все еще могут быть ошибки при попытке доступа к полю объектов на неправильном объекте. Вместо этого используйте плагин pylint-django.
Это неправильный способ исправить Pylint - отключив некоторые его функции. Все, что вам нужно сделать, это установить плагин Pylint, который понимает Django. См. stackoverflow.com/a/31000713/78234
django-lint - хороший инструмент, который обертывает pylint специфическими настройками django: http://chris-lamb.co.uk/projects/django-lint/
проект github: https://github.com/lamby/django-lint
Мне нравится идея pylint, специфичного для Django, но в прошлый раз, когда я ее пробовал, она показалась мне большой ошибкой.
Кроме того, он недоступен через PyPI, и на веб-сайте, похоже, недостаточно информации, например: Какая текущая версия?
Мне нравится эта концепция, но эта реализация является лишь наполовину готовой и не подходит для любой кодовой базы среднего размера. Ему предстоит пройти долгий путь, прежде чем он станет действительно полезным.
django-lint? это довольно интересно. Я посмотрю на это
@gurney alex, линк мертв.
Похоже, что pylint-django сейчас более активен, это должно быть рекомендуемым решением.
Ссылка не работает, и репо на Github не трогали уже 3 года. Для активного решения и плагина Pylint, который понимает Django. См. stackoverflow.com/a/31000713/78234
Мой ~ / .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 обратно разработчикам.
на самом деле они включили этот патч в 0.24, но они начали использовать пакет shlex и сломали кое-что еще. Мне пришлось добавить gen.wordchars += "[]-+" в строке 135, чтобы заставить его работать ...
Использование сгенерированных членов просто скрывает эти ошибки от вас, все еще могут быть ошибки при попытке доступа к полю «объекты» на неправильном объекте. Вместо этого используйте плагин pylint-django.
Это неправильный способ исправить Pylint - отключив некоторые его функции. Все, что вам нужно сделать, это установить плагин Pylint, который понимает Django. См. stackoverflow.com/a/31000713/78234
@TalWeiss - честно говоря, этот ответ на три года старше, чем pylint-django, поэтому отрицательный голос немного резок ...
Решение, предложенное в этом другой вопрос, это просто добавить get_attr в ваш класс Tag. Некрасиво, но работает.
Не отключайте и не ослабляйте функциональность Pylint, добавляя ignores или generated-members.
Используйте активно разрабатываемый плагин Pylint, который понимает Django.
Этот плагин Pylint для Django работает неплохо:
pip install pylint-django
и при запуске pylint добавьте к команде следующий флаг:
--load-plugins pylint_django
Подробное сообщение в блоге здесь.
Ссылка на сообщение в блоге мертва (так скоро). Вот несколько заархивированных ссылок из Интернет-архив и из archive.is
Чтобы он работал с плагином SublimeLinter Sublime Text, мне пришлось добавить --load-plugins=pylint_django в настройку linters / pylint / args. Обратите внимание на знак «=», без него ничего не получилось.
это не работает. Я получаю эту ошибку: E: 8, 0: Нет имени 'models' в модуле 'django.db' (no-name-in-module)
@max Какая у вас полная командная строка? Версии Django и pylint? Полный вывод pylint run?
django 1.8 pylint == 1.4.3 pylint-django == 0.7.1 Я не думаю, что здесь уместно помещать stacktrace ...
При использовании django 1.9, pylint 1.5.2 и pylint-django 0.7.1 плагин pylint_django не отображал models.Manager.get как допустимый метод.
Можете ли вы привести пример того, как я бы использовал его в проекте Django? pylint --load-plugins pylint_django (как мне здесь обратиться к моему проекту Django?)
Вы также можете добавить это в свой pylintrc: [MASTER] load-plugins=pylint_django
В коде vs это не сработает для меня, пока я не введу в пользовательские настройки следующее: {"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],}tieuminh2510 ответ
@azmeuk Спасибо! Заголовок раздела разобраться не смог! Почему МАСТЕР? Где это задокументировано? Как мне узнать в следующий раз, как должны выглядеть формат и разделы .pylintrc?
Честно говоря, не могу вспомнить, где это нашел :(
Если вы используете Visual Studio Code, сделайте следующее:
pip install pylint-django
И добавляем в конфиг VSC:
"python.linting.pylintArgs": [
"--load-plugins=pylint_django"
],
Лучший ответ на сегодняшний день: D
Для 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, спасибо.
см. сообщение @ talweiss для получения актуального ответа!