vscode visual studio run linter code python django static-analysis pylint

python - visual - Usando Pylint con Django



visual studio code pylint django (11)

Me gustaría integrar pylint en el proceso de compilación para mis proyectos Python, pero me he topado con un stop-show: uno de los tipos de error que me parece extremadamente útil: E1101: *%s %r has no %r member* constantemente informa errores cuando se usan campos de django comunes, por ejemplo:

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

que es causado por este código:

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

¿Cómo puedo sintonizar Pylint para tomar en cuenta adecuadamente los campos como los objetos? (También investigué el origen de Django y no he podido encontrar la implementación de los objects , por lo que sospecho que no es "solo" un campo de clase. Por otro lado, soy bastante nuevo en python, por lo que Es muy posible que haya pasado por alto algo).

Editar: La única forma que he encontrado de decirle a la máquina que no advierta sobre estas advertencias es mediante el bloqueo de todos los errores del tipo (E1101) que no es una solución aceptable, ya que (en mi opinión) es un error extremadamente útil. Si hay otra forma, sin aumentar la fuente de la fuente, por favor, dirígeme a los detalles :)

Vea here un resumen de los problemas que he tenido con pychecker y pyflakes : han demostrado ser muy inestables para uso general. (En el caso de pychecker, los bloqueos se originaron en el código pychecker, no en la fuente que estaba cargando / invocando).


Debido a la forma en que funciona pylint (examina la fuente en sí, sin dejar que Python realmente la ejecute) es muy difícil para la empresa descubrir cómo las metaclases y las clases base complejas afectan realmente a una clase y sus instancias. La herramienta ''pychecker'' es un poco mejor en este sentido, porque permite que Python ejecute el código; importa los módulos y examina los objetos resultantes. Sin embargo, ese enfoque tiene otros problemas, porque realmente permite que Python ejecute el código :-)

Puede ampliar la lista para enseñarle sobre la magia que utiliza Django, o para hacer que comprenda mejor las metaclases o las clases base complejas, o simplemente ignorar tales casos después de detectar una o más características que no comprende del todo. No creo que sea particularmente fácil. También puede indicarle a pylint que no advierta sobre estas cosas, a través de comentarios especiales en la fuente, opciones de línea de comandos o un archivo .pylintrc.


Esta no es una solución, pero puede agregar objects = models.Manager() a sus modelos de Django sin cambiar ningún comportamiento.

Yo solo uso pyflakes, principalmente debido a algunos valores predeterminados tontos en la pildora y la pereza de mi parte (no quiero buscar cómo cambiar los valores predeterminados).


Hasta ahora no he encontrado una solución real a eso, pero hay que evitarlo:

  • En nuestra compañía, requerimos una puntuación de pylint> 8. Esto permite que las prácticas de codificación de pylint no comprendan al tiempo que se garantiza que el código no sea demasiado "inusual". Hasta ahora no hemos visto ningún caso en el que E1101 nos impidió alcanzar una puntuación de 8 o superior.
  • Nuestros objetivos de "verificación de resultados" se filtran "para que no haya mensajes de" miembros de objetos "para eliminar la mayor parte de la distracción causada por la pildora sin entender a Django.

Intenta ejecutar pylint con

pylint --ignored-classes=Tags

Si eso funciona, agregue todas las otras clases de Django, posiblemente usando un script, por ejemplo, python: P

La documentación para --ignore-classes es:

--ignored-classes=<members names>
Lista de nombres de clases para los que no se deben verificar los atributos de los miembros (útil para clases con atributos establecidos dinámicamente). [actual:% predeterminado]

Debo añadir que esta no es una solución elegante en particular, desde mi punto de vista, pero debería funcionar.


La solución propuesta en esta otra pregunta simplemente agrega get_attr a su clase Tag. Feo, pero funciona


Mi ~ / .pylintrc contiene

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

los dos últimos son específicamente para Django.

Tenga en cuenta que hay un error en PyLint 0.21.1 que necesita parches para que esto funcione.

Editar: Después de meterme con esto un poco más, decidí hackear PyLint solo un poquito para permitirme expandir lo anterior en:

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

Simplemente agregué:

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

después de la corrección mencionada en el informe de error (es decir, en la línea 129).

¡Días felices!


No desactive o debilite la funcionalidad de Pylint agregando ignores o generated-members .
Use un plugin Pylint desarrollado activamente que entienda a Django.
Este plugin de Pylint para Django funciona bastante bien:

pip install pylint-django

y al ejecutar pylint, agregue la siguiente marca al comando:

--load-plugins pylint_django

Publicación detallada del blog here .


Renuncié al uso de pylint / pychecker a favor de usar pyflakes con el código de Django; solo trata de importar el módulo e informa cualquier problema que encuentre, como importaciones sin usar o nombres locales sin inicializar.


Si usa Visual Studio Code, haga esto:

pip install pylint-django

Y agregar a la configuración de VSC:

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


Uso lo siguiente: pylint --generated-members=objects