• Через Pylint с Джанго

    Я бы очень хотел, чтобы интегрировать pylint в процессе сборки для моего питона проектов, но я столкнулся с одним шоу-стоппером: один из видов ошибок, которые я нахожу чрезвычайно полезными--:E1101: *%s %r has no %r member*--постоянно сообщает об ошибках при использовании общих Джанго поля, например:

    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, чтобы правильно взять таких областях, как объекты в учетной записи? (Я также смотрел в Джанго источник, и я не смог найти реализации objects, так я подозреваю, что это не "просто" поле класса. С другой стороны, я довольно новыми для Python, поэтому я может что-то проглядели.)

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

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

  • Ответы

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

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

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

    Джанго-нибудь вкусненькое-это хороший инструмент который служит оболочкой для pylint с Джанго конкретные параметры : http://chris-lamb.co.uk/projects/django-lint/

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

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

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

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

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

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

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

    pylint --ignored-classes=Tags 

    Если это работает, добавить все остальные классы Джанго - возможно, с помощью скрипта, скажем, на Python :Р

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

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

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

    До сих пор я не нашел реального решения этого вопроса, но обойти:

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

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

    pip install pylint-django 

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

    --load-plugins pylint_django 

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

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