如何禁用Pylint警告?

我正在尝试禁用警告C0321(“单行上有多个语句”;——我经常在Pylint 0.21.1(如果重要的话:astng 0.20.1, common 0.50.3和Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56)中,在同一行中放置带有短单行结果的if语句)。

我尝试在Pylint配置文件中添加disable=C0321,但Pylint坚持报告它。这一行的变体(如disable=0321disable=C321)会被标记为错误,因此Pylint 会正确识别该选项。它只是忽略它。

这是一个Pylint错误,还是我做错了什么?有办法解决这个问题吗?

我真的很想摆脱这些噪音。

453714 次浏览

pylint --generate-rcfile是这样显示的:

[MESSAGES CONTROL]


# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time.
#enable=


# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once).
#disable=

因此,看起来你的~/.pylintrc应该在[MESSAGES CONTROL]节中有disable=行。

我有这个问题使用Eclipse,并解决它如下:

pylint文件夹(例如C:\Python26\Lib\site-packages\pylint)中,按住转变,右键单击并选择打开该文件夹中的windows命令。类型:

lint.py --generate-rcfile > standard.rc

创建standard.rc配置文件。在记事本中打开它,在[MESSAGES CONTROL]下,取消注释 disable=并添加你想禁用的消息ID,例如:

disable=W0511, C0321

保存文件,在Eclipse→窗口首选项PyDev中→*pylint中,在参数框中输入:

--rcfile=C:\Python26\Lib\site-packages\pylint\standard.rc

现在它应该工作了……


你也可以在你的代码顶部添加评论,它将被Pylint解释:

# pylint: disable=C0321

Pylint消息代码 . sh . sh


在参数框中添加例如--disable-ids=C0321是无效的。

所有可用的Pylint消息都存储在字典_messages中,它是pylint.utils.MessagesHandlerMixIn类实例的属性。当使用参数--disable-ids=...运行Pylint时(至少没有配置文件),这个字典最初是空的,在Pylint (pylint.utils.MessagesHandlerMixIn.check_message_id(). c)内引发KeyError异常。

在Eclipse中,你可以在Pylint控制台中看到这个错误消息(windows*→显示视图控制台,在控制台图标旁边的控制台选项中选择Pylint控制台。)

还可以使用以下命令:

pylint --disable=C0321  test.py

我的Pylint版本是0.25.1。

若要在块中禁用本地警告,请添加

# pylint: disable=C0321

到那个街区。

从Pylint v. 0.25.3开始,你可以使用符号名禁用警告而不用记那么多代码。例如:

# pylint: disable=locally-disabled, multiple-statements, fixme, line-too-long

这种风格比神秘的错误代码更有指导意义,也更实用,因为新版本的Pylint只输出符号名称,而不是错误代码。

符号名称和代码之间的对应关系可以在在这里中找到。

disable注释可以插入到它自己的行中,将disable应用到同一块中后面的所有内容。或者,可以将它插入要应用的行末尾。

如果Pylint输出“Locally disabling"消息,你可以通过包括禁用locally-disabled 第一个来摆脱它们,就像上面的例子一样。

有几种方法可以禁用警告&Pylint中的错误。使用哪一个与您希望如何全局或局部地应用禁用有关——这是一个重要的设计决策。

多种方法

  1. 在一个或多个pylintrc文件中。

这不仅仅是Chris Morgan所描述的~/.pylintrc文件(在你的$HOME目录下)。Pylint将搜索rc文件,优先级为“更接近”的文件:

  • 当前工作目录中的pylintrc文件;或

  • 如果当前工作目录在Python模块中(即它包含__init__.py文件),则向上搜索Python模块的层次结构,直到找到pylintrc文件;或

  • 由环境变量PYLINTRC命名的文件;或

  • 如果你的主目录不是/root:

    • ~/.pylintrc;或

    • ~/.config/pylintrc;或

    • /etc/pylintrc

    • 李< / ul > < / >

    注意,这些文件中的大多数都被命名为pylintrc——只有~中的文件有一个前导点。

    pylintrc文件中,添加禁用特定pylint消息的行。例如:

    [MESSAGES CONTROL]
    disable=locally-disabled
    
    1. pylint命令行进一步禁用,如Aboo和Cairnarvon所述。它看起来像pylint --disable=bad-builtin。重复--disable以删除其他项。

    2. 进一步从单个Python代码行禁用,如Imolit所述。它们看起来像some statement # pylint: disable=broad-except(原始源行末尾的额外注释)和仅适用于当前行。我的方法是总是把它们放在其他代码行的末尾,这样它们就不会与块样式混淆,见下文。

    3. 进一步禁用为较大的Python代码块定义的功能,直到完整的源文件。

      • 它们看起来像# pragma pylint: disable=bad-whitespace(注意pragma关键字)。

      • 这些适用于后面的每一行。将这些块放在文件的顶部可以使抑制作用应用于整个文件。将相同的块放在文件中较低的位置,使它们只适用于块后面的行。我的方法是总是把它们放在自己的一行上,这样它们就不会与单行样式混淆,见上文。

      • 当抑制只应用于一段代码范围内时,使用# pragma pylint: enable=bad-whitespace(现在使用enable而不是disable)来停止抑制。

      • 李< / ul > < / >

    注意,对单行禁用使用# pylint语法,而对这一行禁用使用# pragma pylint语法。这些很容易混淆,特别是在复制&粘贴。

    把它们放在一起

    我通常混合使用这些方法。

    • 我将~/.pylintrc用于绝对的全局标准——其中很少。

    • 当存在特定于项目的标准时,我在Python模块中的不同级别上使用项目级pylintrc。特别是当您从其他人或团队中获取代码时,您可能会发现他们使用了您不喜欢的约定,但您又不想重做代码。将设置保持在这个级别有助于不将这些实践扩展到其他项目。

    • 我在单个源文件的顶部使用块风格的pragmas。我喜欢在开发的热中关闭pragmas(停止压制消息),即使对于我不同意的Pylint标准(比如“公共方法太少”——我总是在自定义异常类上得到警告)——但在开发时看到更多/也许所有的Pylint消息是有帮助的。这样,您就可以用单行pragmas(见下文)找到想要解决的情况,或者只是为下一个开发人员添加注释,以解释为什么在这种情况下警告是可以的。

    • 即使在代码准备好检入时,我也会启用一些块风格的pragmas。我尽量少使用其中的一些,但当它对模块有意义时,可以作为文档使用。然而,我尽量少留下,最好没有。

    • 我使用单行注释样式来处理特别严重的错误。例如,如果有一个地方确实有意义的except Exception as exc,我把# pylint: disable=broad-except放在那一行,而不是一个更全面的方法,因为这是一个奇怪的异常,需要被调用,基本上作为一种文档形式。


    像Python中的其他东西一样,您可以在不同的间接级别上进行操作。我的建议是,考虑一下哪些内容属于哪个级别,这样就不会对Pylint采取过于宽松的方法。

这是一个常见问题解答:

4.1是否可以在本地禁用特定的消息?

是的,此特性已在Pylint 0.11中添加。这可以通过 添加 # pylint: disable=some-message,another-one在所需的

.

.

.

.

4.2是否有一种方法只对特定模块禁用消息?

是的,您可以禁用或启用(全局禁用)消息 的注释中添加相应的选项 文件顶部:

# pylint: disable=wildcard-import, method-hidden
# pylint: enable=too-many-lines

您可以通过以下方式禁用消息:

  • 数值ID: E1101E1102等。
  • 符号消息:no-memberundefined-variable等。
  • 一组检查的名称。你可以用pylint --list-groups获取它们。
  • 支票类别:CRW等。
  • 所有的检查all

Pylint消息的完整列表请参见的文档(或在终端中运行pylint --list-msgs)。文档还提供了一个很好的例子来说明如何使用这个特性。

为了帮助别人,如果你使用Visual Studio代码,它期望文件是UTF-8编码。为了生成文件,我在PowerShell中运行pylint --generate-rcfile | out-file -encoding utf8 .pylintrc

Python语法允许一行上有多条语句,以分号(;)分隔。但是,将每行限制为一条语句可以使人们在通读程序时更容易遵循程序的逻辑。

所以,解决这个问题的另一种方法是,理解为什么lint消息在那里,而不是在一行上放置一个以上的语句。

是的,您可能会发现每行编写多个语句更容易,但是,Pylint是为您代码的所有其他读者而不仅仅是您。

你只需要添加一行来禁用你想禁用的东西。

例如,

#pylint: disable = line-too-long, too-many-lines, no-name-in-module, import-error, multiple-imports, pointless-string-statement, wrong-import-order

将此添加到模块的最开始。

C:\Users\Your User\AppData\Roaming\Code\User\settings.json; 并添加'python.linting。

. pylintArgs'和它的行在最后,如下所示
{
"team.showWelcomeMessage": false,
"python.dataScience.sendSelectionToInteractiveWindow": true,
"git.enableSmartCommit": true,
"powershell.codeFormatting.useCorrectCasing": true,
"files.autoSave": "onWindowChange",
"python.linting.pylintArgs": [
"--load-plugins=pylint_django",
"--errors-only"
],
}

根据Pylint文档,最简单的方法是使用这个图表:

  • C约定相关的检查
  • R重构相关的检查
  • W各种警告
  • E错误,用于代码中可能的错误
  • F致命,如果发生错误导致Pylint无法进行进一步处理。

所以你可以用:

pylint -j 0 --disable=I,E,R,W,C,F YOUR_FILES_LOC
抱歉,我和最初的问题有点偏离,关于海报的一般偏好,这将通过全局配置文件更好地解决。 但是,就像许多流行的答案一样,我倾向于选择看看我的代码中有什么会触发警告,最终也会选择通知贡献者
我对来自@imolit的回答的注释需要保持简短,以下是一些细节

对于multiple-statements消息,最好像这样禁用在块或模块级别,

# pylint: disable=multiple-statements

我的用例现在是unittest setup()中的attribute-defined-outside-init,我选择了line-scoped消息禁用,使用消息代码来避免line-too-long问题。

class ParserTest(unittest.TestCase):
def setUp(self):
self.parser = create_parser()  # pylint: disable=W0201

可以在本地使用类似的命令找到对应关系

$ pylint --list-msgs | grep 'outside-init'
:attribute-defined-outside-init (W0201): *Attribute %r defined outside __init__*

当然,您也可以类似地从代码中检索符号名称。

我的pylint一直忽略我的.pylintrc中的disable列表。最后,我意识到我在执行:

pylint --disable=all --enable=F,E,W

它覆盖了我的.pylintrc中的disable列表。

只显示致命、错误、警告的正确命令是:

pylint --disable=C,R