Utilisation de pylint avec Django

j'aimerais beaucoup intégrer pylint dans le processus de génération pour mes projets python, mais j'ai rencontré un show-stoppeur: L'un des les types d'erreurs que je trouve extrêmement utiles--: E1101: *%s %r has no %r member* -- signale constamment des erreurs lors de l'utilisation des champs django communs, par exemple:

E1101:125:get_user_tags: Class 'Tag' has no 'objects' member

qui est causé par ce code:

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

Comment puis-je accorder Pylint pour bien prendre des champs tels que les objets dans compte? (J'ai aussi regardé dans la source de Django, et j'ai été incapable de trouver l'implémentation de objects , donc je soupçonne que ce n'est pas "juste" un champ de classe. D'un autre côté, je suis assez nouveau en python, donc je pourrais très bien avoir négligé quelque chose.)

Edit: le seul moyen que j'ai trouvé pour dire à pylint de ne pas mettre en garde contre ces avertissements est en bloquant toutes les erreurs du type (E1101) qui n'est pas une solution acceptable, puisque c'est (dans mon opinion) une erreur extrêmement utile. S'il y a une autre façon, sans augmenter la source de pylint, s'il vous plaît pointez-moi aux détails:)

voir ici pour un résumé des problèmes que j'ai eus avec pychecker et pyflakes -- ils se sont avérés loin d'être instables pour un usage général. (Dans le cas de pychecker, les accidents proviennent du code de pychecker -- pas de la source qu'il chargeait/invoquait.)

121
demandé sur rcreswick 2008-09-22 20:39:34

12 réponses

ne pas désactiver ou affaiblir la fonctionnalité du Pylint en ajoutant ignores ou generated-members .

Utilisez un plugin pylint développé activement qui comprend Django.

ce plugin Pylint pour Django fonctionne très bien:

pip install pylint-django

et lors de l'exécution de pylint ajouter le drapeau suivant à la commande:

--load-plugins pylint_django

blog détaillé ici .

113
répondu Tal Weiss 2015-06-23 11:25:22

j'utilise ce qui suit: pylint --generated-members=objects

62
répondu Shai 2013-05-02 08:12:20

My ~/.pylintrc contient

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

les deux derniers sont spécifiquement pour Django.

notez qu'il y a un bug dans PyLint 0.21.1 qui doit être corrigé pour que cela fonctionne.

Edit: après avoir joué avec ceci un peu plus, j'ai décidé de hacker PyLint juste un tout petit peu pour me permettre d'étendre le ci-dessus dans:

[TYPECHECK]
generated-members=REQUEST,acl_users,aq_parent,objects,_meta,id,[a-zA-Z]+_set

j'ai simplement ajouté:

    import re
    for pattern in self.config.generated_members:
        if re.match(pattern, node.attrname):
            return

après la correction mentionnée dans le rapport de bogue (c.-à-d. à la ligne 129).

les jours Heureux!

29
répondu simon 2010-11-12 09:24:34

django-lint est un bel outil qui enveloppe pylint avec les paramètres spécifiques de django: http://chris-lamb.co.uk/projects/django-lint/

projet github: https://github.com/lamby/django-lint

19
répondu gurney alex 2015-01-19 10:19:16

en raison de la façon dont pylint fonctionne (il examine la source elle-même, sans laisser Python l'exécuter réellement) il est très difficile pour pylint de comprendre comment les métaclasses et les baseclasses complexes affectent réellement une classe et ses instances. L'outil 'pychecker' est un peu meilleur à cet égard, car il fait laisse en fait Python exécuter le code; il importe les modules et examine les objets résultants. Toutefois, cette approche pose d'autres problèmes, car elle en fait, laissez Python exécuter le code :-)

vous pouvez étendre pylint pour lui enseigner les utilisations magiques de Django, ou pour lui faire comprendre les métaclasses ou les baseclasses complexes mieux, ou tout simplement ignorer de tels cas après avoir détecté une ou plusieurs fonctionnalités qu'il ne comprend pas tout à fait. Je ne pense pas qu'il serait particulièrement facile. Vous pouvez aussi juste dire à pylint de ne pas mettre en garde contre ces choses, à travers des commentaires spéciaux dans la source, des options de ligne de commande ou un .fichier pylintrc.

16
répondu Thomas Wouters 2008-09-22 16:46:00

si vous utilisez Visual Studio Code, faites ceci:

pip install pylint-django

et ajouter à la config VSC:

"python.linting.pylintArgs": [
    "--load-plugins=pylint_django"
],
11
répondu thiagofalcao 2017-12-12 14:09:20

ce n'est pas une solution, mais vous pouvez ajouter objects = models.Manager() à vos modèles Django sans changer de comportement.

Je n'utilise moi-même que des pyflakes, principalement en raison de quelques défauts muets dans le pylint et la paresse de ma part (ne voulant pas chercher comment changer les défauts).

7
répondu AdamKG 2008-09-23 00:17:58

j'ai démissionné de l'utilisation de pylint/pychecker en faveur de l'utilisation de pyflakes avec le code Django - il essaie juste d'importer le module et les rapports de tout problème qu'il trouve, comme les importations inutilisées ou les noms locaux non initialisés.

6
répondu zgoda 2008-09-22 20:12:40

essayez de lancer pylint avec

pylint --ignored-classes=Tags

si cela fonctionne, ajouter toutes les autres classes Django-éventuellement en utilisant un script, par exemple, python: p

la documentation pour --ignore-classes est:

--ignored-classes=<members names>

Liste des classes noms des membres les attributs ne doivent pas être vérifiés (utile pour les classes avec des attributs dynamicaly set). [courant: %par défaut]

je devrais ajouter qu'il ne s'agit pas d'une solution particulièrement élégante à mon avis, mais elle devrait fonctionner.

5
répondu freespace 2008-09-22 16:50:09

La solution proposée dans ce autre question il simplement ajouter get_attr à votre Balise de classe. Laid, mais il fonctionne.

2
répondu eric 2017-05-23 11:54:53

Jusqu'à présent, je n'ai pas trouvé de véritable solution à cela, mais travailler autour:

  • dans notre entreprise nous avons besoin d'un pylint score > 8. Cela permet de codage pratiques que pylint ne comprend pas tout en s'assurant que le code n'est pas trop "insolite". Jusqu'à présent, nous havn pas vu tous les cas où E1101 nous a gardés d'atteindre un score de 8 ou supérieur.
  • nos cibles "make check" filtre "n'a pas de "objets" messages des membres pour supprimer la plupart des distraction causé par pylint pas la compréhension de Django.
1
répondu max 2009-01-04 11:37:48

pour neovim & vim8 utiliser w0rp's ale plugin. Si vous avez tout installé correctement, y compris w0rp's ale , pylint & pylint-django . Dans votre vimrc ajouter la ligne suivante & avoir du plaisir à développer des applications Web en utilisant django. Grâce.

let g:ale_python_pylint_options = '--load-plugins pylint_django'
0
répondu Ganesh 2018-06-14 12:40:38