【问题标题】:Using Pylint with Django在 Django 中使用 Pylint
【发布时间】:2010-09-12 01:44:51
【问题描述】:

我非常希望将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 源,请指出具体细节:)

请参阅here,了解我在使用pycheckerpyflakes 时遇到的问题的摘要——事实证明,它们对于一般用途来说远非不稳定。 (在 pychecker 的情况下,崩溃源于 pychecker 代码——而不是它正在加载/调用的源代码。)

【问题讨论】:

  • 查看@talweiss 的帖子以获得最新答案!
  • stackoverflow.com/a/31000713/78234找到了很好的解决方案
  • 您能接受@talweiss 的回答吗?这是最新且正确的解决方案。

标签: python django static-analysis pylint


【解决方案1】:

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

pip install pylint-django

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

--load-plugins pylint_django

详细博文here

【讨论】:

  • 博客文章的链接已失效(很快)。以下是来自Internet Archivearchive.is 的一些存档链接
  • 为了让它与 Sublime Text 的 SublimeLinter 插件一起使用,我必须将 --load-plugins=pylint_django 添加到 linters/pylint/args 设置中。请注意“=”符号,没有它就无法工作。
  • 它不起作用。我收到此错误:E: 8, 0: No name 'models' in module 'django.db' (no-name-in-module)
  • 你也可以在你的pylintrc中添加这个:[MASTER] load-plugins=pylint_django
  • 在 vs 代码中它对我不起作用,直到我在用户设置中输入以下内容:{"python.linting.pylintArgs": [ "--load-plugins=pylint_django" ],}tieuminh2510's answer
【解决方案2】:

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

【讨论】:

  • man pylint(1) under TYPECHECK --generated-members=<members names> 动态设置并被 pylint 推理系统遗漏的成员列表,因此在访问时不应触发 E0201 和 E1101。 [当前:请求,acl_users,aq_parent]
  • 我在preferences in the PyDev/PyLint section下的eclipse中的PyDev中添加了这个。
  • 使用生成的成员只是对您隐藏这些错误,尝试访问错误对象上的对象字段时仍然可能出现错误。请改用 pylint-django 插件。
  • 这是修复 Pylint 的错误方法 - 通过禁用它的某些功能。您需要做的就是安装一个理解 Django 的 Pylint 插件。见stackoverflow.com/a/31000713/78234
【解决方案3】:

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

pip install pylint-django

并添加到 VSC 配置中:

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

【讨论】:

  • 迄今为止最好的回应:D
【解决方案4】:

我的 ~/.pylintrc 包含

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

最后两个是专门为 Django 设计的。

请注意,有一个 bug in 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 行)。

快乐的日子!

【讨论】:

  • 你应该将你的补丁提交给 pylint 给维护者。
  • 实际上他们已经在 0.24 中包含了这个补丁,但是他们已经开始使用 shlex 包,并且现在破坏了其他东西。我必须在第 135 行添加 gen.wordchars += "[]-+" 才能让它工作......
  • 使用生成的成员只是对您隐藏这些错误,尝试访问错误对象上的“对象”字段时仍然可能出现错误。请改用 pylint-django 插件。
  • 这是修复 Pylint 的错误方法 - 通过禁用它的某些功能。您需要做的就是安装一个理解 Django 的 Pylint 插件。见stackoverflow.com/a/31000713/78234
  • @TalWeiss -- 公平地说,这个答案比pylint-django 大三岁,所以反对票有点苛刻......
【解决方案5】:

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

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

【讨论】:

  • 我喜欢 Django 特定的 pylint 的想法,但我上次尝试时它似乎是个大问题。
  • 此外,它不能通过 PyPI 获得,而且该网站似乎没有提供足够的信息,例如:当前版本是什么?
  • 我喜欢这个概念,但是这个实现只是半生不熟,并且在任何中等大小的代码库上都会中断。在它真正有用之前还有很长的路要走。
  • @gurney alex,链接死了。
  • 看起来 pylint-django 现在更活跃了,这应该是建议的解决方案。
【解决方案6】:

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

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

【讨论】:

  • 向 Pylint 教授有关 Django 的知识并不容易,但已经做到了:您需要做的就是安装一个 了解 Django 的 Pylint 插件。见stackoverflow.com/a/31000713/78234
  • 好吧,我安装了它,但它仍然对诸如 QuerySet 没有删除之类的细线感到不满...
【解决方案7】:

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

【讨论】:

【解决方案8】:

这不是一个解决方案,但您可以将 objects = models.Manager() 添加到您的 Django 模型中,而无需更改任何行为。

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

【讨论】:

  • 啊...谢谢你的提示。我可以尝试将其添加到 django 源的本地副本中的 Model.models 中,看看是否可以。
  • 我认为这是一个很好的解决方案,因为它不会影响警告。
  • 这是一个糟糕的解决方案。重复自己并替换一些可行的东西会在以后改变(从而引入一个 QA 问题),只是为了修复一个不完整的 QA 工具?
  • 我不会称这是一个糟糕的解决方案:显式优于隐式。也许objects 无论如何都不应该被神奇地添加。
  • 我认为这是修复 Pylint 的错误方法——在某种意义上通过修补 Django。您需要做的就是安装一个理解 Django 的 Pylint 插件。见stackoverflow.com/a/31000713/78234
【解决方案9】:

尝试使用 pylint 运行

pylint --ignored-classes=Tags

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

--ignore-classes 的文档是:

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

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

【讨论】:

  • 只有在我从不在这些类中犯任何错误的情况下才有效;)。如果可能的话,我想避免忽略代码——我认为对代码库的不同部分进行不同程度的审查是一个非常糟糕的主意。我会忘记哪个是哪个,在调试的时候做出错误的假设
  • 这是修复 Pylint 的错误方法 - 通过禁用它的某些功能。您需要做的就是安装一个理解 Django 的 Pylint 插件。见stackoverflow.com/a/31000713/78234
【解决方案10】:

other question 中提出的解决方案只需将 get_attr 添加到您的 Tag 类。丑陋,但有效。

【讨论】:

    【解决方案11】:

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

    let g:ale_python_pylint_options = '--load-plugins pylint_django'
    

    【讨论】:

    • 在购买 vim 和 neovim 时对我来说非常适合,谢谢。
    【解决方案12】:

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

    • 在我们公司,我们需要一个 pylint score > 8. 这允许编码 实践pylint不明白 同时确保代码不是 太“不寻常”了。到目前为止我们还没有看到 E1101 留住我们的任何情况 从达到8分或 更高。
    • 我们的“检查”目标 过滤掉“因为没有‘对象’ 成员”消息删除大部分 由 pylint 引起的分心不是 了解 Django。

    【讨论】:

      猜你喜欢
      • 2011-12-14
      • 1970-01-01
      • 2021-05-20
      • 2018-10-25
      • 2011-04-19
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 2011-02-02
      相关资源
      最近更新 更多