Я очень хотел бы интегрировать pylint в процесс сборки для моих проектов python, но я столкнулся с одним show-stopper: один из типов ошибок, которые я считаю чрезвычайно полезными -: - 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, а не в источнике, который он загружал / вызывал.)
источник
Ответы:
Не отключайте и не ослабляйте функциональность Pylint, добавляя
ignores
илиgenerated-members
.Используйте активно разрабатываемый плагин Pylint, который понимает Django.
Этот плагин Pylint для Django работает неплохо:
и при запуске pylint добавьте к команде следующий флаг:
Подробное сообщение в блоге здесь .
источник
--load-plugins=pylint_django
настройку linters / pylint / args. Обратите внимание на знак «=», без него ничего не получилось.[MASTER] load-plugins=pylint_django
{"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],}
введуЯ использую следующее:
pylint --generated-members=objects
источник
--generated-members=<members names>
Список элементов, которые устанавливаются динамически и пропускаются системой вывода pylint, поэтому не должны запускать E0201 и E1101 при доступе. [current: REQUEST, acl_users, aq_parent]Если вы используете Visual Studio Code, сделайте следующее:
pip install pylint-django
И добавляем в конфиг VSC:
"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],
источник
Мой ~ / .pylintrc содержит
последние два предназначены специально для Django.
Обратите внимание, что в PyLint 0.21.1 есть ошибка, которую нужно исправить, чтобы это работало.
Изменить: немного поработав с этим, я решил немного взломать PyLint, чтобы позволить мне расширить приведенное выше до:
Я просто добавил:
import re for pattern in self.config.generated_members: if re.match(pattern, node.attrname): return
после исправления, упомянутого в отчете об ошибке (т. е. в строке 129).
Счастливые дни!
источник
shlex
пакет и сломали кое-что еще. Мне пришлось добавитьgen.wordchars += "[]-+"
в строку 135, чтобы заставить его работать ...pylint-django
, так что отрицательный голос немного резок ...django-lint - хороший инструмент, который обертывает pylint специфическими настройками django: http://chris-lamb.co.uk/projects/django-lint/
проект github: https://github.com/lamby/django-lint
источник
Из-за того, как работает pylint (он проверяет сам исходный код, не позволяя Python выполнить его на самом деле), для pylint очень сложно выяснить, как метаклассы и сложные базовые классы на самом деле влияют на класс и его экземпляры. «Pychecker» инструмент немного лучше в этом отношении, потому что он делает на самом деле пусть Python выполнения кода; он импортирует модули и проверяет полученные объекты. Однако у этого подхода есть другие проблемы, потому что он действительно позволяет Python выполнять код :-)
Вы можете расширить pylint, чтобы научить его магии, которую использует Django, или чтобы он лучше понимал метаклассы или сложные базовые классы, или просто игнорировал такие случаи после обнаружения одной или нескольких функций, которые он не совсем понимает. Не думаю, что это будет особенно легко. Вы также можете просто указать pylint не предупреждать об этих вещах с помощью специальных комментариев в исходном коде, параметров командной строки или файла .pylintrc.
источник
Я отказался от использования pylint / pychecker в пользу использования pyflakes с кодом Django - он просто пытается импортировать модуль и сообщает о любых обнаруженных проблемах, таких как неиспользуемый импорт или неинициализированные локальные имена.
источник
Это не решение, но вы можете добавлять
objects = models.Manager()
в свои модели Django, не меняя поведения.Я сам использую только pyflakes, в первую очередь из-за некоторых глупых значений по умолчанию в pylint и моей лени (не желая искать, как изменить значения по умолчанию).
источник
objects
любом случае не следует добавлять волшебным образом.Попробуйте запустить pylint с
Если это сработает, добавьте все остальные классы Django - возможно, используя скрипт, скажем, python: P
Документация для
--ignore-classes
:Я должен добавить, что это не особо элегантное решение, на мой взгляд, но оно должно работать.
источник
Решение, предложенное в этом другом вопросе, - просто добавить get_attr в ваш класс Tag. Некрасиво, но работает.
источник
Пока я не нашел реального решения для этого, но работаю:
источник
Для
neovim & vim8
использованияw0rp's ale
плагина. Если вы установили все правильно в том числеw0rp's ale
,pylint
иpylint-django
. В вашемvimrc
добавить следующую строку и весело провести время разработки веб - приложений с использованием Django. Спасибо.let g:ale_python_pylint_options = '--load-plugins pylint_django'
источник