Me gustaría mucho integrar pylint en el proceso de compilación para mis proyectos de Python, pero me he encontrado con un show-stopper: uno de los tipos de error que encuentro extremadamente útil: E1101: *%s %r has no %r
member*
- informa constantemente errores al usar campos comunes de django , 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 ajustar Pylint para tener en cuenta correctamente campos como los objetos? (También busqué en la fuente de Django y no pude encontrar la implementación objects
, por lo que sospecho que no es "solo" un campo de clase. Por otro lado, soy bastante nuevo en Python, así que puede muy bien haber pasado por alto algo).
Editar: La única forma en que he encontrado decirle a pylint que no advierta sobre estas advertencias es bloqueando todos los errores del tipo (E1101) que no es una solución aceptable, ya que es (en mi opinión) un error extremadamente útil. Si hay otra forma, sin aumentar la fuente de pylint, indíqueme detalles :)
Vea aquí un resumen de los problemas que he tenido pychecker
y pyflakes
que han demostrado ser muy inestables para uso general. (En el caso de pychecker, los bloqueos se originaron en el código de pychecker, no en el origen que se estaba cargando / invocando).
fuente
Respuestas:
No deshabilite ni debilite la funcionalidad de Pylint agregando
ignores
ogenerated-members
.Use un complemento Pylint desarrollado activamente que entienda Django.
Este complemento de Pylint para Django funciona bastante bien:
y cuando ejecute pylint agregue la siguiente bandera al comando:
Publicación detallada del blog aquí .
fuente
--load-plugins=pylint_django
a la configuración linters / pylint / args. Tenga en cuenta el signo '=', no funcionó sin él.[MASTER] load-plugins=pylint_django
{"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],}
respuesta de tieuminh2510Yo uso lo siguiente:
pylint --generated-members=objects
fuente
--generated-members=<members names>
Lista de miembros configurados dinámicamente y omitidos por el sistema de inferencia pylint, por lo que no deberían activar E0201 y E1101 cuando se accede a ellos. [actual: SOLICITUD, acl_users, aq_parent]Mi ~ / .pylintrc contiene
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 jugar un poco más con esto, decidí piratear PyLint solo un poco para permitirme expandir lo anterior en:
Simplemente agregué:
después de la corrección mencionada en el informe de error (es decir, en la línea 129).
¡Días felices!
fuente
shlex
paquete y ahora rompieron algo más. Tuve que agregargen.wordchars += "[]-+"
en la línea 135 para que funcione ...pylint-django
, por lo que el downvote es un poco duro ...Si usa Visual Studio Code, haga esto:
pip install pylint-django
Y agregue a la configuración de VSC:
fuente
django-lint es una buena herramienta que envuelve pylint con configuraciones específicas de django: http://chris-lamb.co.uk/projects/django-lint/
proyecto github: https://github.com/lamby/django-lint
fuente
Debido a cómo funciona pylint (examina la fuente en sí, sin dejar que Python realmente lo ejecute) es muy difícil para pylint descubrir cómo las metaclases y las clases base complejas realmente afectan a una clase y sus instancias. La herramienta 'pychecker' es un poco mejor en este sentido, ya que no en realidad dejó Python ejecutar el código; importa los módulos y examina los objetos resultantes. Sin embargo, ese enfoque tiene otros problemas, porque en realidad permite que Python ejecute el código :-)
Puede extender pylint para enseñarle sobre la magia que usa Django, o para que comprenda mejor las metaclases o las clases base complejas, o simplemente ignore estos 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 decirle 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.
fuente
Renuncié a usar pylint / pychecker a favor de usar pyflakes con código Django: solo intenta importar el módulo e informa cualquier problema que encuentre, como importaciones no utilizadas o nombres locales no inicializados.
fuente
Esta no es una solución, pero puede agregarla
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 pylint y pereza de mi parte (no queriendo buscar cómo cambiar los valores predeterminados).
fuente
objects
no debería agregarse mágicamente de todos modos.Intenta ejecutar pylint con
Si eso funciona, agregue todas las otras clases de Django, posiblemente utilizando un script, por ejemplo, python: P
La documentación para
--ignore-classes
es:Debo agregar que, en mi opinión, esta no es una solución elegante en particular, pero debería funcionar.
fuente
La solución propuesta en esta otra pregunta es simplemente agregar get_attr a su clase Tag. Feo, pero funciona.
fuente
Hasta ahora no he encontrado una solución real para eso, pero evite:
fuente
Para
neovim & vim8
uso delw0rp's ale
complemento. Si ha instalado todo correctamentew0rp's ale
, incluyendo ,pylint
&pylint-django
. En suvimrc
complemento, la siguiente línea y diviértase desarrollando aplicaciones web usando django. Gracias.fuente