81 votos

El uso de Pylint con Django

Me gustaría mucho para integrar pylint en el proceso de generación de mi python proyectos, pero se han topado con un show-tapón: Uno de los tipos de error que me parece muy útil -:E1101: *%s %r has no %r member*--constantemente los informes de errores cuando el uso común de django campos, por ejemplo:

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

que es causada 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 tomar correctamente los campos como de los objetos en cuenta? (También he mirado en el Django de origen, y he sido incapaz de encontrar la aplicación de objects, por lo que sospecho que no es "sólo" un campo de clase. Por otro lado, soy bastante nuevo en python, así que puede muy bien haber pasado por alto algo.)

Edit: La única manera que he encontrado para decirle pylint para no advertir acerca de estas advertencias es mediante el bloqueo de todos los errores del tipo (E1101) que no es una solución aceptable, ya que es (en mi opinión) muy útil error. Si hay otra manera, sin aumentar la pylint fuente, por favor, que me señale detalles :)

Vea aquí un resumen de los problemas que yo he tenido pychecker y pyflakes - y han demostrado ser mucho inestables para uso general. (En pychecker el caso de los accidentes que se originó en el pychecker código-fuente no era de carga/invocación.)

28voto

simon Puntos 3630

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 un parche para hacer este trabajo.

Edit: Después de jugar con él un poco más, decidí hack PyLint sólo un poco que me permita ampliar la anterior en:

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

Simplemente he añadido:

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

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

Felices días!

18voto

gurney alex Puntos 4837

django-la pelusa es una buena herramienta que se ajusta a pylint con django ajustes específicos : http://chris-lamb.co.uk/projects/django-lint/

15voto

Thomas Wouters Puntos 38811

Porque de cómo pylint obras (se analiza el origen de sí mismo, sin dejar de Python en realidad ejecutarlo) es muy duro para los pylint de averiguar cómo metaclasses y complejo baseclasses afecta realmente a una clase y sus instancias. El 'pychecker herramienta es un poco mejor en este aspecto, porque no dejar que Python ejecutar el código; las importaciones de los módulos y examina los objetos resultantes. Sin embargo, ese enfoque tiene otros problemas, porque en realidad vamos a Python ejecutar el código :-)

Se podría extender pylint para enseñar acerca de la magia de Django usa, o para hacer entender metaclasses o complejo baseclasses mejor, o simplemente ignorar tales casos después de la detección de una o más características, que no acaba de entender. Creo que no sería muy fácil. También se puede simplemente decir pylint para no advertir acerca de estas cosas, a través de comentarios especiales en la fuente, opciones de línea de comandos o una .pylintrc archivo.

8voto

AdamKG Puntos 6521

Esta no es una solución, pero usted puede agregar objects = models.Manager() de su Django modelos sin cambiar cualquier comportamiento.

Yo sólo uso pyflakes, principalmente debido a algún tonto por defecto en el pylint y pereza por mi parte (no querer buscar cómo cambiar los valores predeterminados).

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X