如何在使用Django时隐藏Pylint 1.2.1错误输出?

2 投票
2 回答
1288 浏览
提问于 2025-04-18 09:12

我正在尝试把pylint这个工具整合到我们使用的Django项目中(版本是1.6.1)。之前我用的是Pylint 0.27.0,运行得很好,但现在我升级到最新的1.2.1后,出现了一些新的错误,我怎么也解决不了。

这些错误的具体情况是这样的:


from django.db import models

class UserData(models.Model):
    # data...
    fieldA  = models.IntegerField(default=0)
    fieldB  = models.IntegerField(default=0)

# ...

x = UserData(fieldA=1, fieldB=2)
# The above line of code generates errors:
# Unexpected keyword argument 'fieldA' in constructor call (unexpected-keyword-arg)
# Unexpected keyword argument 'fieldB' in constructor call (unexpected-keyword-arg)
# No value for argument 'name' in constructor call (no-value-for-parameter)
# No value for argument 'bases' in constructor call (no-value-for-parameter)
# No value for argument 'attrs' in constructor call (no-value-for-parameter)

我试着在pylint检查的时候修改文件,像这样:

UserData.__init__ = lambda self, *args, **kwargs: None

但是Pylint还是报出同样的错误。我也尝试直接在UserData对象里加上构造函数的调用,但还是没用。

有没有办法让我修改代码或者pylint的设置,让这些错误不再出现?最好是不要对整个项目都隐藏这些错误。

2 个回答

2

你可以通过在模块的顶部添加一个特定的规则注释,来在模块级别禁用这些错误:

# pylint: disable=unexpected-keyword-arg, no-value-for-parameter

from django.db import models

class UserData(models.Model):
    ...

从版本0.25.3开始,你可以使用错误的符号名称(而不是错误编号)来表示错误。


看起来这个pylint的问题源于2014年4月的一个提交。这个问题已经被一个审查者指出,还有其他用户也受到影响,但似乎还没有解决。

简单来说,当pylint分析一个可调用对象时,它会根据可调用对象的类型检查不同的参数。不幸的是,如果这个可调用对象是一个类,它会首先检查__new__(在某些情况下,这个方法可能存在于父类的元类中),如果找到了,就会完全忽略__init__。这就是你收到的错误提到namebasesattrs的原因,比如它们是__new__的参数。

1

pylint 版本 1.4 开始,这些错误在使用 Django 时就不会再出现了。

撰写回答