使用Pylint和Django

rcr*_*ick 137 python django static-analysis pylint

我非常希望将pylint集成到我的python项目的构建过程中,但是我遇到了一个show-stopper:我觉得非常有用的一种错误类型 - : - E1101: *%s %r has no %r member*在使用常见的django字段时会报告错误, 例如:

E1101:125:get_user_tags: Class 'Tag' has no 'objects' member
Run Code Online (Sandbox Code Playgroud)

这是由这段代码引起的:

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
Run Code Online (Sandbox Code Playgroud)

如何调整Pylint以正确考虑对象等字段?(我也查看了Django源码,我一直无法找到它的实现objects,所以我怀疑它不是"只是"一个类字段.另一方面,我对python很新,所以我很可能忽略了一些东西.)

编辑:我发现告诉pylint没有警告这些警告的唯一方法是阻止所有类型的错误(E1101)这是不可接受的解决方案,因为(在我看来)这是一个非常有用的错误.如果有另一种方式,没有增加pylint源,请指出具体信息:)

这里对于我已经受够了问题的总结pycheckerpyflakes-他们已经被证明是远远不稳定的一般用途.(在pychecker的情况下,崩溃起源于pychecker代码 - 而不是源代码正在加载/调用.)

Tal*_*iss 146

不要通过添加ignores或禁用或削弱Pylint功能generated-members.
使用一个了解 Django 的积极开发的Pylint插件.
这个Django的Pylint插件运行得很好:

pip install pylint-django
Run Code Online (Sandbox Code Playgroud)

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

--load-plugins pylint_django
Run Code Online (Sandbox Code Playgroud)

详细博客文章在这里.

  • 这需要尽快得到接受的答案 (10认同)
  • 你也可以在你的pylintrc中添加它:````[MASTER] load-plugins = pylint_django``` (6认同)
  • 博客文章的链接已死(这么快)。这里有一些来自 [Internet Archive](https://web.archive.org/web/20141008054046/http://blog.landscape.io/using-pylint-on-django-projects-with-pylint- django.html) 和 [archive.is](http://archive.is/Lb9f0) (4认同)
  • 为了使它与Sublime Text的SublimeLinter插件一起使用,我必须将`--load-plugins = pylint_django`添加到linters/pylint/args设置中.注意'='符号,如果没有它,它就无法工作. (3认同)
  • 在vs代码中,它对我不起作用,直到我在用户设置中输入以下内容:`{“ python.linting.pylintArgs”:[“ --load-plugins = pylint_django”],}`[tieuminh2510的答案](https ://stackoverflow.com/a/47343542/5697765) (2认同)

小智 63

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

  • 这是修复Pylint的错误方法 - 通过禁用它的一些功能.您需要做的就是安装一个**了解**Django的Pylint插件.请参见http://stackoverflow.com/a/31000713/78234 (5认同)
  • 使用生成成员只是隐藏了这些错误,尝试访问错误对象上的对象字段时仍然可能出错.请改用pylint-django插件. (2认同)

sim*_*mon 30

我的〜/ .pylintrc包含

[TYPECHECK]
generated-members=REQUEST,acl_users,aq_parent,objects,_meta,id
Run Code Online (Sandbox Code Playgroud)

最后两个是专门为Django.

请注意,PyLint 0.21.1中存在一个错误,需要修补才能使其正常工作.

编辑:经过多次讨论之后,我决定稍微破解PyLint以允许我将上述内容扩展为:

[TYPECHECK]
generated-members=REQUEST,acl_users,aq_parent,objects,_meta,id,[a-zA-Z]+_set
Run Code Online (Sandbox Code Playgroud)

我简单地说:

    import re
    for pattern in self.config.generated_members:
        if re.match(pattern, node.attrname):
            return
Run Code Online (Sandbox Code Playgroud)

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

快乐的时光!

  • 使用生成成员只是隐藏了这些错误,尝试访问错误对象上的"对象"字段时仍然可能出错.请改用pylint-django插件. (4认同)
  • 这是修复Pylint的错误方法 - 通过禁用它的一些功能.您需要做的就是安装一个**了解**Django的Pylint插件.请参见http://stackoverflow.com/a/31000713/78234 (4认同)
  • @TalWeiss - 公平地说,这个答案比`pylint-django`大三岁,所以downvote有点苛刻...... (3认同)

Thi*_*cao 23

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

pip install pylint-django

并添加到VSC配置:

"python.linting.pylintArgs": [
    "--load-plugins=pylint_django"
],
Run Code Online (Sandbox Code Playgroud)

  • 迄今为止最好的回应:D (4认同)

gur*_*lex 19

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

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

  • 此外,它不是通过PyPI提供的,该网站似乎没有提供足够的信息,如:当前版本是什么? (3认同)
  • 看起来pylint-django现在更活跃,应该是建议的解决方案. (2认同)

Tho*_*ers 16

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

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

  • 教Pylint关于Django并不容易,但它已经完成了:你需要做的就是安装一个**理解**Django的Pylint插件.请参见http://stackoverflow.com/a/31000713/78234 (3认同)

zgo*_*oda 7

我辞职了使用pylint/pychecker而不是使用带有Django代码的pyflakes - 它只是尝试导入模块并报告它找到的任何问题,例如未使用的导入或未初始化的本地名称.

  • PyChecker比pylint少得多.http://www.doughellmann.com/articles/CompletelyDifferent-2008-03-linters/index.html (2认同)

Ada*_*mKG 7

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

我自己只使用pyflakes,主要是由于我的pylint和懒惰的一些哑默认(不想查找如何更改默认值).

  • 我不认为这是一个糟糕的解决方案:显性比隐含更好.无论如何,也许不应该神奇地添加"对象". (2认同)

fre*_*ace 5

尝试运行pylint

pylint --ignored-classes=Tags
Run Code Online (Sandbox Code Playgroud)

如果可以的话,添加所有其他Django类 - 可能使用脚本,比如python:P

文档--ignore-classes是:

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

我应该补充一点,在我看来,这不是一个特别优雅的解决方案,但它应该有效.