在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源的情况下,请指出具体内容:)
在这里可以看到我用pychecker
和pyflakes
所遇到的问题的总结 - 它们已被证明对于一般用途而言远不稳定。 (在Pychecker的情况下,崩溃源自pychecker代码 - 不是源代码正在加载/调用。)
不要通过添加ignores
或generated-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