使用pylint的使用Django(Using Pylint with Django)

2019-06-26 10:57发布

我非常想整合pylint的到我的Python项目的构建过程,但我遇到了一个表明,塞:一,我觉得非常useful--错误类型: E1101: *%s %r has no %r member*使用普通的Django字段时,例如--constantly报告错误:

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 ,所以我怀疑它是不是“只是”一类的领域。在另一方面,我是相当新的蟒蛇,所以我很可能忽略了一些东西。)

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

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

Answer 1:

请勿禁用或加入削弱pylint的功能, ignoresgenerated-members
用一个积极的发展pylint的插件, 理解 Django的。
这pylint的插件Django的工作得很好:

pip install pylint-django

运行时pylint的添加以下标志的命令:

--load-plugins pylint_django

详细的博客文章在这里 。



Answer 2:

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



Answer 3:

我的〜/ .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

在bug报告中提到的(即,在管线129)修复后。

快乐的时光!



Answer 4:

Django的皮棉是一个很好的工具,它包装pylint的Django的具体设置: http://chris-lamb.co.uk/projects/django-lint/

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



Answer 5:

由于如何pylint的作品(它检查源本身,而不让Python的实际执行它),这是非常困难的pylint的找出元类和复杂的基类实际上是如何影响一个类及其实例。 在“pychecker”工具在这方面好一点,因为实际上是让Python的执行代码; 它导入模块,并检查所产生的对象。 然而,这种方法还有其他的问题,因为它实际上是让Python的执行代码:-)

你可以扩展pylint的教它关于Django使用魔法,或使其了解元类或复杂的基类更好,或检测一个或多个特征不很明白后,就忽略这样的情况。 我不认为这将是特别容易。 您也可以只告诉pylint的不警告这些事情,通过在源,命令行选项或.pylintrc文件的特殊注释。



Answer 6:

如果您使用Visual Studio代码做到这一点:

pip install pylint-django

而添加到VSC的配置:

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


Answer 7:

我从赞成使用pyflakes和Django代码的使用pylint的/ pychecker辞职 - 它只是尝试导入模块,并报告发现,像未使用的导入或初始化本地名称的任何问题。



Answer 8:

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

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



Answer 9:

尝试与运行pylint的

pylint --ignored-classes=Tags

如果这样的作品,加上所有其他Django的类 - 可能使用一个脚本,在说,蟒蛇:P

对于文档--ignore-classes是:

--ignored-classes=<members names>
对于该成员属性不被检查的类名称的列表(用于与属性的类dynamicaly设置)。 [电流:%默认]

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



Answer 10:

在此提出的解决方案的另一个问题是简单地GET_ATTR添加到您的标签类。 难看,但作品。



Answer 11:

到目前为止,我没有发现任何真正解决这一而是解决:

  • 在我们公司,我们需要一个pylint的得分> 8,这使得编码做法,同时确保该代码是不是太“不寻常” pylint的不理解。 到目前为止,我们没有带在哪里见过E1101使我们到达比分8或更高版本的任何实例。
  • 我们的“做检查”目标筛选出“为没有‘对象’成员”的消息,除去大部分引起pylint的不理解Django的分心的。


Answer 12:

对于neovim & vim8使用w0rp's ale插件。 如果你安装了正确的一切,包括w0rp's alepylintpylint-django 。 在你vimrc添加以下行和有乐趣开发使用Django网络应用程序。 谢谢。

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


Answer 13:

  1. 按Ctrl +转到VSC设置,
  2. 按下Ctrl + Shift + P,类型的Python:选择短绒
  3. 从下拉菜单中选择mypy
  4. 如果提示安装mypy。


文章来源: Using Pylint with Django