在Django中使用Pylint

我非常想将pylint整合到我的python项目的构建过程中,但是我遇到了一个显示限制器:我发现其中一种非常有用的错误类型 - : E1101: *%s %r has no %r member*在使用常用django字段时不时报告错误,例如:

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

这是由以下代码引起的:

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

我如何调整Pylint以正确地考虑对象等字段? (我也研究过Django的源代码,并且我一直无法找到objects的实现,所以我怀疑它不是“仅仅”一个类字段。另一方面,我对python相当陌生,所以我可能已经忽略了一些东西。)

编辑:我发现告诉pylint不警告这些警告的唯一方法是通过阻止所有类型错误(E1101),这是不可接受的解决方案,因为这是(在我看来)一个非常有用的错误。 如果还有其他方法,请在不增加pylint源的情况下,请指出具体内容:)

在这里可以看到我用pycheckerpyflakes所遇到的问题的总结 - 它们已被证明对于一般用途而言远不稳定。 (在Pychecker的情况下,崩溃源自pychecker代码 - 不是源代码正在加载/调用。)


不要通过添加ignoresgenerated-members禁用或削弱Pylint功能。
使用一个积极开发的理解 Django的Pylint插件。
Django的这个Pylint插件工作得很好:

pip install pylint-django

并在运行pylint时将以下标志添加到命令中:

--load-plugins pylint_django

这里详细的博客文章。


我使用以下内容: pylint --generated-members=objects


我的〜/ .pylintrc包含

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

最后两个是专门针对Django的。

请注意,PyLint 0.21.1中存在一个需要修补才能完成此工作的错误。

编辑:在弄乱了这一点之后,我决定只用一点点的手段来破解PyLint,以便让我将上面的内容扩展为:

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

我简单地补充道:

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

在错误报告中提到的修复之后(即在第129行)。

快乐的时光!

链接地址: http://www.djcxy.com/p/54157.html

上一篇: Using Pylint with Django

下一篇: Can a C++ class member function template be virtual?