在Django中使用Pylint

152 投票
13 回答
64400 浏览
提问于 2025-04-11 09:18

我很想把 pylint 集成到我的 Python 项目的构建过程中,但我遇到了一个大问题:有一种错误类型我觉得特别有用——E1101: *%s %r 没有 %r 成员*——在使用常见的 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 自身的代码引起的,而不是它加载或调用的源代码。)

13 个回答

40

如果你在使用 Visual Studio Code,可以这样做:

pip install pylint-django

然后在 VSC 的配置里添加:

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

我使用以下命令:pylint --generated-members=objects

172

不要通过添加 ignoresgenerated-members 来禁用或削弱 Pylint 的功能。
建议使用一个积极开发的 Pylint 插件,它能够理解 Django。
这个针对 Django 的 Pylint 插件效果很好:

pip install pylint-django

在运行 pylint 时,请在命令中添加以下标志:

--load-plugins pylint_django

详细的博客文章可以在 这里找到。

撰写回答