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.)
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 .
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!
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
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.
si vous utilisez Visual Studio Code, faites ceci:
pip install pylint-django
et ajouter à la config VSC:
"python.linting.pylintArgs": [
"--load-plugins=pylint_django"
],
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).
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.
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.
La solution proposée dans ce autre question il simplement ajouter get_attr à votre Balise de classe. Laid, mais il fonctionne.
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.
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'