150

我非常想将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 代码——而不是它正在加载/调用的源代码。)

4

12 回答 12

169

不要通过添加ignores或来禁用或削弱 Pylint 功能generated-members
使用理解Django 的积极开发的 Pylint 插件。
这个 Django 的 Pylint 插件运行良好:

pip install pylint-django

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

--load-plugins pylint_django

详细的博文在这里

于 2015-06-23T10:47:45.510 回答
64

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

于 2009-09-12T22:21:47.310 回答
37

如果您使用 Visual Studio Code,请执行以下操作:

pip install pylint-django

并添加到 VSC 配置:

"python.linting.pylintArgs": [
    "--load-plugins=pylint_django"
],
于 2017-12-12T14:09:20.387 回答
31

我的 ~/.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 行)。

快乐的时光!

于 2010-11-12T08:59:11.543 回答
19

django-lint 是一个很好的工具,它使用 django 特定设置包装 pylint: http ://chris-lamb.co.uk/projects/django-lint/

github项目:https ://github.com/lamby/django-lint

于 2010-03-16T17:00:16.963 回答
16

由于 pylint 的工作方式(它检查源本身,而不让 Python 实际执行它),pylint 很难弄清楚元类和复杂基类如何实际影响类及其实例。'pychecker' 工具在这方面要好一些,因为它确实让 Python 执行代码;它导入模块并检查生成的对象。但是,这种方法还有其他问题,因为它确实让 Python 执行代码:-)

你可以扩展 pylint 来教它 Django 使用的魔法,或者让它更好地理解元类或复杂的基类,或者在检测到它不太理解的一个或多个特性后忽略这种情况。我认为这不会特别容易。您也可以通过源代码、命令行选项或 .pylintrc 文件中的特殊注释告诉 pylint 不要警告这些事情。

于 2008-09-22T16:46:00.760 回答
7

我放弃使用 pylint/pychecker 转而使用带有 Django 代码的 pyflakes - 它只是尝试导入模块并报告它发现的任何问题,例如未使用的导入或未初始化的本地名称。

于 2008-09-22T20:12:40.373 回答
7

这不是一个解决方案,但您可以在objects = models.Manager()不改变任何行为的情况下添加到您的 Django 模型中。

我自己只使用 pyflakes,主要是由于我在 pylint 中的一些愚蠢的默认设置和懒惰(不想查找如何更改默认设置)。

于 2008-09-23T00:17:58.663 回答
5

尝试运行 pylint

pylint --ignored-classes=Tags

如果可行,请添加所有其他 Django 类 - 可能使用脚本,例如 python :P

的文档--ignore-classes是:

--ignored-classes=<members names>
不应检查其成员属性的类名称列表(对于动态设置属性的类很有用)。[当前:%default]

我应该补充一点,在我看来,这不是一个特别优雅的解决方案,但它应该可以工作。

于 2008-09-22T16:50:09.160 回答
3

在这个其他问题中提出的解决方案只需将get_attr添加到您的 Tag 类中。丑陋,但有效。

于 2011-02-24T12:48:37.580 回答
2

用于neovim & vim8使用w0rp's ale插件。如果您已正确安装所有内容,包括w0rp's ale, pylint& pylint-django。在您vimrc添加以下行并享受使用 django 开发 Web 应用程序的乐趣。谢谢。

let g:ale_python_pylint_options = '--load-plugins pylint_django'
于 2018-06-14T12:40:38.173 回答
1

到目前为止,我还没有找到真正的解决方案,但可以解决:

  • 在我们公司,我们要求 pylint 分数 > 8。这允许 pylint 不理解的编码实践,同时确保代码不太“不寻常”。到目前为止,我们还没有看到 E1101 使我们无法达到 8 分或更高分的情况。
  • 我们的 'make check' 目标过滤掉“for has no 'objects' member” 消息,以消除由于 pylint 不理解 Django 造成的大部分干扰。
于 2009-01-04T11:37:48.100 回答