Використання Пілінта з Джанго


140

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

Дивіться тут для опису проблем , які я мав з pycheckerі pyflakes- вони виявилися далеко нестабільний для загального користування. (У випадку pychecker, збої виникли в коді pychecker - не джерело, яке він завантажував / викликав.)


4
Дивіться пост @ talweiss, щоб отримати оновлену відповідь!
Брендан

Знайдено гарне рішення в stackoverflow.com/a/31000713/78234
shahjapan

1
Чи можете ви прийняти відповідь @talweiss? Це найсучасніше і правильне рішення.
Віджай Варадан

Відповіді:


155

Не вимикайте та не послаблюйте функціональність Pylint, додавши ignoresабо generated-members.
Використовуйте активно розроблений плагін Pylint, який розуміє Django.
Цей плагін Pylint для Django працює досить добре:

pip install pylint-django

і під час запуску пілінта додайте до команди наступний прапор:

--load-plugins pylint_django

Детальна публікація в блозі тут .


2
Посилання на допис у блозі мертве (так скоро). Ось декілька заархівованих посилань з Інтернет-архіву та з archive.is
Крістіан Лонг

3
Щоб працювати з плагіном SublimeLinter Text Sublime Text, мені довелося додати --load-plugins=pylint_djangoналаштування linters / pylint / args. Зверніть увагу на знак "=", без нього не вийшло.
Денніс Голомазов

це не працює. Я отримую цю помилку: E: 8, 0: У модулі 'django.db' (без імені в модулі) немає імені 'models'
макс

6
Ви також можете додати це у своєму pylintrc:[MASTER] load-plugins=pylint_django
azmeuk

3
У порівнянні з кодом ця доза не працює для мене, поки я не {"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],} вкладу в
ali-myousefi

63

Я використовую наступне: pylint --generated-members=objects


man pylint (1) під TYPECHECK --generated-members=<members names>Перелік членів, які динамічно встановлюються та пропускаються системою висновку пілінта, і тому не повинні запускати E0201 та E1101 під час доступу. [поточний: ЗАПИТАННЯ, acl_users, aq_parent]
Марк Мікофський

Я додаю це в PyDev у затемненні під налаштуваннями в розділі PyDev / PyLint .
Марк Мікофський

2
Використання згенерованих членів просто приховує від вас ці помилки, все ж можуть виникати помилки при спробі отримати доступ до поля об’єктів на неправильному об’єкті. Замість цього використовуйте плагін pylint-django.
Вайк Гермеч

5
Це неправильний спосіб виправити Pylint - відключивши частину його функціональності. Все, що вам потрібно зробити - це встановити плагін Pylint, який розуміє Django. Дивіться stackoverflow.com/a/31000713/78234
Tal Weiss

31

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

Щасливі дні!


Ви маєте надіслати свій патч на пілінт назад до обслуговуючого персоналу.
коляска

насправді вони включили цей виправлення в 0,24, але вони почали використовувати shlexпакет і зараз зламали щось інше. Мені довелося додати gen.wordchars += "[]-+"в рядку 135, щоб він працював ...
simon

4
Використання згенерованих членів просто приховує від вас ці помилки, все ж можуть виникати помилки при спробі доступу до поля 'об’єкти' на неправильному об’єкті. Замість цього використовуйте плагін pylint-django.
Вайк Гермеч

4
Це неправильний спосіб виправити Pylint - відключивши частину його функціональності. Все, що вам потрібно зробити - це встановити плагін Pylint, який розуміє Django. Дивіться stackoverflow.com/a/31000713/78234
Tal Weiss

3
@TalWeiss - чесно кажучи, ця відповідь на три роки старша pylint-django, тому знищення є трохи суворим ...
simon

27

Якщо ви використовуєте код Visual Studio, зробіть це:

pip install pylint-django

І додайте до VSC config:

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

2
Найкраща відповідь на сьогодні: D
serfer2

19

django-lint - це приємний інструмент, який обгортає пілінт із певними налаштуваннями джанго: http://chris-lamb.co.uk/projects/django-lint/

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


1
Мені подобається ідея пелінга, характерного для Джанго, але, схоже, великий баггі останній раз, коли я його спробував.
Wernight

3
Крім того, вона недоступна через PyPI, і веб-сайт, здається, не дає достатньо інформації, як-от: Яка поточна версія?
Wernight

1
Концепція мені подобається, але ця реалізація лише напівфабрикатна і працює на будь-якій базі коду середнього розміру. До її дійсного корисного ще належить довгий шлях.
Серін

1
@gurney alex, Посилання мертве.
shuttle87

2
Схоже, пілінт-джанго зараз активніше, це повинно бути рекомендованим рішенням.
Вайк Гермеч

16

Через те, як працює pylint (він вивчає саме джерело, не даючи Python насправді його виконувати), pylint дуже важко зрозуміти, як метакласи та складні базові класи насправді впливають на клас та його екземпляри. «Pychecker» інструмент трохи краще в цьому відношенні, тому що він робить на самому ділі нехай Python виконання коду; він імпортує модулі та вивчає отримані об'єкти. Однак у цього підходу є інші проблеми, оскільки він фактично дозволяє Python виконувати код :-)

Ви можете розширити пілінт, щоб навчити його магії, яку використовує Джанго, або щоб вона краще зрозуміла метакласи або складні базові класи, або просто ігнорувати такі випадки після виявлення однієї або декількох функцій, які вона не зовсім розуміє. Я не думаю, що це було б особливо легко. Ви також можете просто сказати pylint не попереджати про ці речі, за допомогою спеціальних коментарів у джерелі, параметрах командного рядка або файлі .pylintrc.


3
Викладати Pylint про Джанго непросто, але це було зроблено: все, що вам потрібно зробити, це встановити плагін Pylint, який розуміє Django. Дивіться stackoverflow.com/a/31000713/78234
Tal Weiss

Ну я встановив його, але він все ще поєднується з тонкими, як QuerySet не видаляє ...
Eino Mäkitalo

7

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


цікаво - я дам піфлякам ще один вигляд.
rcreswick

2
PyChecker ловить набагато менше, ніж пілінт. doughellmann.com/articles/CompletelyDifferent-2008-03-linters/…
Джастін Абрамс

1
Не потрібно здаватися на Pylint - Все, що вам потрібно зробити, це встановити плагін Pylint, який розуміє Django. Дивіться stackoverflow.com/a/31000713/78234
Tal Weiss

7

Це не є рішенням, але ви можете додавати objects = models.Manager()до своїх моделей Django, не змінюючи жодної поведінки.

Я сам використовую лише піфлаки, в першу чергу через деякі німі типові параметри в pylint і лінь з мого боку (не хочу шукати, як змінити типові налаштування).


Ах ... дякую за пораду. Я можу спробувати просто додати це до Model.models в локальній копії джерела django, і побачити, чи це це робиться.
rcreswick

Я вважаю, що це чудове рішення, оскільки воно не йде на компроміс із попередженнями.
Том Лейс

1
Це погане рішення. Повторення себе та заміна чогось, що це можливо, пізніше зміниться (таким чином введено проблему з якістю), просто виправити неповний інструмент QA?
Кріс Морган

2
Я б не назвав це поганим рішенням: явне краще, ніж неявне. Можливо, objectsвсе одно не слід магічно додавати.
Вілл Харді

1
Я думаю, що це неправильний спосіб виправити Pylint - за допомогою погладжування Django. Все, що вам потрібно зробити - це встановити плагін Pylint, який розуміє Django. Дивіться stackoverflow.com/a/31000713/78234
Tal Weiss

5

Спробуйте запустити пілінт за допомогою

pylint --ignored-classes=Tags

Якщо це працює, додайте всі інші класи Django - можливо, використовуючи сценарій, скажімо, python: P

Документація на --ignore-classes:

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

Варто додати, що це, на мій погляд, не є особливим елегантним рішенням, але воно має спрацювати.


Це працює лише в тому випадку, якщо я ніколи не помиляюся в цих класах;). Я хочу уникати ігнорування коду, якщо це взагалі можливо - я думаю, що дуже погана ідея, щоб різні частини кодової бази проаналізували різний ступінь уважності. Я забуду, що є що, і буду робити помилкові припущення під час налагодження
rcreswick

1
Це неправильний спосіб виправити Pylint - відключивши частину його функціональності. Все, що вам потрібно зробити - це встановити плагін Pylint, який розуміє Django. Дивіться stackoverflow.com/a/31000713/78234
Tal Weiss


1

Поки що я не знайшов реального вирішення цього питання, окрім як:

  • У нашій компанії нам потрібна оцінка pylint> 8. Це дозволяє практиці кодування pylint не розуміти, гарантуючи, що код не надто "незвичний". Поки що ми не бачили жодного випадку, коли E1101 не дозволив нам досягти оцінки 8 або вище.
  • Наші повідомлення "зробити перевірку" відфільтрувати ", щоб не було повідомлень" член "об'єктів", щоб усунути більшість відволікань, спричинених пілінтом, не розуміючим Джанго.

0

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

let g:ale_python_pylint_options = '--load-plugins pylint_django'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.