150 votes

À l’aide de Pylint avec Django

J'aimerais beaucoup intégrer pylint dans le processus de génération pour mon python projets, mais j'ai couru dans un show-bouchon: l'Un des types d'erreur que je trouve extrêmement utile -:E1101: *%s %r has no %r member*--constamment des rapports d'erreurs lors de l'utilisation commune de django champs, 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 tune Pylint à prendre correctement des domaines tels que les objets en compte? (J'ai aussi regardé dans le Django source, et j'ai été incapable de trouver la mise en œuvre de l' objects, donc je pense qu'il n'est pas "juste" un champ de classe. D'autre part, je suis assez nouveau dans python, donc je peut très bien avoir oublié quelque chose.)

Edit: Le seul moyen que j'ai trouvé à dire pylint de ne pas avertir à propos de ces avertissements est en bloquant toutes les erreurs de type (E1101) qui n'est pas une solution acceptable, étant donné que c'est (à mon avis) très utile d'erreur. Si il y a une autre façon, sans augmenter la pylint source, merci de m'indiquer les détails :)

Voir ici pour un résumé des problèmes que j'ai eu avec pychecker et pyflakes -- ils l'ont prouvé à être loin de l'instabilité pour un usage général. (En pychecker cas, les accidents d'origine dans le pychecker code -- pas de source c'était chargement/invoquant.)

31voto

simon Points 3630

Mon ~/.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 a besoin de patcher pour faire ce travail.

Edit: Après de déconner avec ces choses un peu plus, j'ai décidé de hack PyLint juste un tout petit peu, pour me permettre de développer la ci-dessus:

[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 le correctif mentionné dans le rapport de bug (c'est à dire, à la ligne 129).

Les jours heureux!

19voto

gurney alex Points 4837

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

16voto

Thomas Wouters Points 38811

En raison de la façon dont pylint fonctionne (il examine la source elle-même, sans laisser Python de l'exécution), c'est très dur pour pylint à comprendre comment les metaclasses et complexe baseclasses fait affecter une classe et de ses instances. Le "pychecker' outil est un peu mieux dans ce sens, car il ne fait laisser Python exécuter le code; il importe les modules et examine les objets qui en résultent. Cependant, cette approche a d'autres problèmes, parce qu'il fait de laisser Python exécuter le code :-)

Vous pouvez étendre pylint de l'enseigner à propos de la magie de Django utilise, ou d'en faire comprendre les metaclasses ou complexe baseclasses mieux, ou de les ignorer de tels cas, après la détection d'un ou de plusieurs fonctionnalités il n'a pas tout à fait comprendre. Je ne pense pas qu'il serait particulièrement facile. Vous pouvez aussi simplement dire pylint de ne pas avertir au sujet de ces choses, par le biais de remarques particulières à la source, les options de ligne de commande ou un .pylintrc fichier.

7voto

AdamKG Points 6521

Ce n’est pas une solution, mais vous pouvez ajouter `` à vos modèles de Django sans modifier n’importe quel comportement.

J’ai moi-même utiliser seulement pyflakes, principalement en raison de certains défauts muets dans pylint et la paresse de ma part (ne pas vouloir chercher comment modifier les paramètres par défaut).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X