如何禁用Pylint警告?


266

我正在尝试在Pylint 0.21.1中禁用警告C0321(“在一行上有多个语句” –我经常将if具有短单行结果的语句放在同一行上)(如果重要:astng 0.20)。 1,常见的0.50.3,Python 2.6.6(r266:84292,2010年9月15日,16:22:56)。

我尝试添加disable=C0321Pylint配置文件,但是Pylint坚持要报告它。该行的变化(例如disable=0321disable=C321)被标记为错误,因此Pylint 确实正确识别了该选项,只是忽略了它。

这是Pylint的错误,还是我做错了什么?有没有办法解决?我真的很想摆脱一些杂音。


1
如果您要禁用一行代码,而不是所有类型的错误,那么这里有一个很好的解决方案
Le Droid

Answers:


167

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应该disable=在section中有一行[MESSAGES CONTROL]


1
谢谢,但已经这样做了,如上图所示,在[消息控制]部分中。仍然被忽略。
极客头球2010年

6
@Head Geek:好,对我有用。~/.pylintrc有两行,[MESSAGES CONTROL]disable=C0321。这阻止了该消息。
克里斯·摩根

奇怪...与PyLint完全相同的版本?
极客头

@Head Geek:实际上是0.21.3,astng 0.20.3和通用0.52.1(我安装时的最新版本,比您安装的最新)
Chris Morgan

1
@克里斯·摩根:嗯。可能是一个已经修复的错误,然后-我正在使用Ubuntu存储库中的版本。谢谢!
极客头

165

我在使用Eclipse时遇到了此问题,并按以下步骤解决了该问题:

在pylint文件夹(例如C:\Python26\Lib\site-packages\pylint)中,按住shift键并单击鼠标右键,然后选择打开该文件夹中的Windows命令。类型:

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

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

disable=W0511, C0321

保存文件,然后在Eclipse-> window-> preferences-> PyDev-> pylint的参数框中,键入:

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

现在应该可以了...


您还可以在代码的顶部添加注释,该注释将由pylint解释:

# pylint: disable=C0321

链接到所有pylint消息代码


--disable-ids=C0321在参数框中添加例如无效。所有可用的pylint消息都存储在字典中_messages,字典是pylint.utils.MessagesHandlerMixIn该类实例的属性。当使用带有参数--disable-ids=...(至少没有配置文件)运行pylint时,此字典最初为空,从而在pylint(pylint.utils.MessagesHandlerMixIn.check_message_id()。中引发KeyError异常。在Eclipse中,您可以在Pylint 控制台中看到此错误消息(windows-show view-Console ,从控制台图标旁边的控制台选项中选择Pylint控制台。)


2
不,它确实不应该。1)它引用了Eclipse,与所问的问题无关。2)建议禁用旧消息代码。对于最简单的问题解决方案,我将建议的答案;对于更多详细信息,我将建议克里斯·约翰逊的答案
imolit

153

从Pylint v。0.25.3开始,您可以使用符号名来禁用警告,而不必记住所有这些代码号。例如:

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

这种样式比隐式错误代码更具启发性,并且也更实用,因为较新版本的Pylint仅输出符号名称,而不输出错误代码。

符号名和代码之间的对应关系可以在此处找到。

可以在其自己的行上插入禁用注释,将禁用应用于同一块之后的所有内容。或者,可以将其插入要应用的行的末尾。

如果pylint输出“ Locally disabling”消息,您可以通过在上面的示例中locally-disabled 首先包含disable来摆脱它们。


20
但是放上# pylint: disable=foo烯丙基会使我排队太长,所以现在我需要添加, line-too-long!舌头颊; 这就是我所需要的,可以解决我的问题。谢谢!
dwanderson


81

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

# pylint: disable=C0321

到那个街区。


5
这是一项旧技术,不再建议使用。查看其他答案。
Acumenus

1
您的意思是应该使用符号名而不是代码号,对吗?
塔基斯

5
是。imolit答案正好涵盖了这一点。
Acumenus

2
如何找到符号名称?我的编辑器会吐出来[pylint] C0111: Missing method docstring,因此查找代码编号很容易,但是找到符号名称意味着我必须查找它。
亚当·帕金

@AdamParkin我在这里找到了我的消息:pylint-messages.wikidot.com/all-messages
Jean-Francois T.

80

有几种方法可以从Pylint禁用警告和错误。使用哪一个与您要在全局或本地应用禁用功能的方式有关—这是一项重要的设计决策。

多种方法

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

这涉及的不只是~/.pylintrcChris Morgan描述的文件(在$ HOME目录中)。Pylint将搜索rc文件,其优先级是对“ closer”文件的重视程度更高:

  • 一个pylintrc在当前工作目录下的文件; 要么

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

  • 该文件由环境变量PYLINTRC命名;要么

  • 如果您的主目录不是/root

    • ~/.pylintrc; 要么

    • ~/.config/pylintrc; 要么

    • /etc/pylintrc

请注意,其中大多数文件都已命名pylintrc-仅其中的文件~带有前导点。

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

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

  2. 如Imolit所述,从各个Python代码行进一步禁用。它们看起来像some statement # pylint: disable=broad-except(在原始源代码行的末尾加了注释),仅适用于当前行。我的方法是始终将它们放在其他代码行的末尾,以免它们与块样式混淆,请参见下文。

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

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

    • 这些适用于编译指示每一行。在文件的顶部放置一个这样的块可以使抑制作用适用于整个文件。将同一块放在文件的较低位置,使它们仅适用于该块之后的行。我的方法是始终将它们放在自己的一行上,这样它们就不会与单行样式混淆,请参见上文。

    • 当抑制仅在代码范围内适用时,请使用# pragma pylint: enable=bad-whitespace(现在使用enablenot disable)停止抑制。

请注意,禁用单行将使用# pylint语法,而禁用此行以后将使用# pragma pylint语法。这些很容易混淆,尤其是在复制和粘贴时。

放在一起

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

  • 我使用~/.pylintrc绝对的全球标准-其中很少。

  • pylintrc当存在特定于项目的标准时,我在Python模块中的不同级别使用项目级。特别是当您从另一个人或团队那里获取代码时,您可能会发现他们使用了您不希望使用的约定,但是您不想重做代码。将设置保持在此级别不会有助于将这些做法传播到其他项目。

  • 我在单个源文件的顶部使用块样式实用程序。即使对于我不同意的Pylint标准,我也喜欢在开发热时关闭编译指示(停止抑制消息)(例如“公共方法太少-我总是在自定义Exception类上得到警告”),但是在开发过程中查看更多(也许所有Pylint消息)很有帮助。这样,您可以找到要使用单行编译指示解决的情况(请参见下文),或仅为下一个开发人员添加注释,以解释为什么在这种情况下可以接受该警告。

  • 即使在代码准备好检入的情况下,我仍然启用了一些块样式的编译指示。我尝试使用其中的一些,但是当对模块有意义时,可以作为文档来使用。但是,我尝试保留尽可能少的内容,最好不保留任何内容。

  • 我使用单行注释样式来解决特别是潜在的错误。例如,如果有实际可行的地方,那么except Exception as exc我将其# pylint: disable=broad-except放在这行上,而不是采用更全局的方法,因为这是一个奇怪的例外,需要以基本上是一种文档形式的形式予以提及。


像Python中的所有其他内容一样,您可以在不同级别的间接操作。我的建议是考虑什么属于哪个级别,这样您就不会对Pylint过于宽容。



1
在大多数情况下,我不能主张使用全局非空~/.pylintrc。恕我直言,配置通常应绑定到项目,因此它必须在项目中的某个位置。只有这样,它才能进行版本控制并与项目共享。如果失败,则克隆可能缺少pylint退出而不打印消息所必需的自定义设置。
Acumenus

@ABB我认为这是明智之举
克里斯·约翰逊

3
@ChrisJohnson前缀pragma 似乎完全没有必要。例如,我# pylint: disable=missing-docstring在文件的顶部,它适用于文件的其余部分。请检查并pragma从答案中删除前缀。
Acumenus '16

Pylint FAQ没有写任何实用说明。(pylint.pycqa.org/en/latest/…):您可以在模块级别禁用或启用(全局禁用)消息,方法是在文件顶部的注释中添加相应的选项:#pylint:disable = wildcard-导入,方法隐藏的#pylint:enable = too-many-lines
Yaroslav Nikitenko

18

您还可以使用以下命令:

pylint --disable=C0321  test.py

我的pylint版本是0.25.1。


现在这是一项遗留技术。建议改用禁用警告的符号名。看到这个答案
Acumenus

这似乎也不适用于该--py3k标志:(
DylanYoung

有趣的是,如果在rc文件中提供它,它也可以正常工作,并且(更令人不安的是)它实际上使用生成了正确的rc文件--generate-rcfile。必须爱代码与做相同的事情的多个分支:(
DylanYoung

18

这是一个常见问题解答

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 --list-msgs在终端中运行)以获取pylint消息的完整列表。该文档还提供了有关如何使用此功能的好示例


5

您只需要添加一行即可禁用您要禁用的内容。例如

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

将其添加到模块中的#1


4

如果这对某人有帮助,则如果您使用的是Visual Studio Code,则希望该文件采用UTF8编码。为了生成文件,我pylint --generate-rcfile | out-file -encoding utf8 .pylintrc在PowerShell中运行。


0

根据pylint文档,最简单的方法是使用以下图表

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

因此,可以使用:

pylint -j 0 --disable=I,E,R,W,C,F YOUR_FILES_LOC

-1

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

因此,解决此问题的另一种方法是理解为什么出现了皮棉消息,并且在一行中没有放置多个语句。

是的,您可能会发现每行编写多个语句更容易,但是pylint不仅适合您,而且适用于代码的所有其他阅读器。


-1

您可能要尝试以下操作:

编辑“ C:\ Users \您的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"
    ],
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.