如何禁用 Pylint 的警告?

417

我试图禁用C0321警告(“一行上有多个语句” - 我经常将if语句与短单行结果放在同一行上),在Pylint 0.21.1中(如果有影响:astng 0.20.1,common 0.50.3和Python 2.6.6(r266:84292,2010年9月15日,16:22:56))。

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

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

我真的很想消除一些噪音。


4
如果您想禁用单行代码而不是某种错误的所有错误,则此处有一个很好的解决方案 - Le Droid
14个回答

255

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

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

这种风格比晦涩的错误代码更具指导性,也更实用,因为较新版本的Pylint仅输出符号名称,而不是错误代码。

可以在单独的一行上插入禁用注释,将其应用于同一块中之后的所有内容。或者,它可以插入到其应用的行的末尾。

如果Pylint输出“Locally disabling”消息,则可以通过像上面的示例中那样首先包含禁用locally-disabled来摆脱它们。


41
但是在代码中加入#pylint: disable = foo会让我的行变得太长,所以现在我需要添加, line-too-long!此处有点玩笑;但这正是我所需要的,并解决了我的问题。谢谢! - dwanderson
我们可能会从最初的问题偏离,关于一般用户偏好,因此最好通过全局配置文件来解决。对于我的当前用例,我更喜欢在代码中看到可能触发警告的内容,因此选择了基于行的消息禁用,使用消息代码来避免“行过长”的问题。可以通过类似pylint --list-msgs | grep <code or keyword>的命令在本地找到相应的对应关系。有关详细信息,请参见我的答案,因为评论需要保持简短。 - RockyRoad
3
@omni 提供的链接已经失效。您可以输入 pylint --list-msgs 来列出所有字符串。 - Théo Rubenach
1
https://gist.github.com/omniproc/965bb613177dd4fa896b815aa0e0e365 - omni

235

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=行。


3
谢谢,但是它已经在上面显示的 [消息控制] 部分执行了。 仍然被忽略。 - Head Geek
10
@Head Geek: 对我来说很有效。 ~/.pylintrc 文件里只需两行,分别是 [MESSAGES CONTROL]disable=C0321,就可以防止那个信息的出现。 - Chris Morgan
奇怪...难道是完全相同版本的PyLint吗? - Head Geek
@Head Geek:实际上,我安装的是0.21.3、astng 0.20.3和common 0.52.1(比你的更加新)。 - Chris Morgan
如果您想要一个特定于项目的pylintrc,请确保将其命名为“pylintrc”,否则需要明确指定位置。 - Bryce Guinta
我使用了 pylint --generate-toml-config >> pyproject.toml - Jasha

206

我在使用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菜单栏中选择 WindowPreferencesPyDev → *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 Console中看到此错误消息(windows* → show viewConsole,从控制台选项旁边的控制台图标中选择Pylint控制台)。


4
不,实际上不应该。1)它提到Eclipse,与所提出的问题无关。2)它建议通过遗留的消息代码禁用。我建议使用我的答案来解决这个问题,或者使用Chris Johnson的答案以获得更多细节。 - imolit
-1 创建全局配置文件是有害的,因为它会影响系统中所有用户。如果必要,应该创建一个每个用户都有自己的配置文件,或更好的做法是创建一个专门针对项目的配置文件。 - Flow

105
在一个代码块中禁用警告,需添加:
# pylint: disable=C0321

到那个区块。


13
这是一种已经过时的技术,不再推荐使用。请查看其他答案。 - Asclepius
2
你的意思是应该使用符号名称而不是代码编号,对吗? - thakis
11
好的,imolit在stackoverflow上的回答恰好涵盖了这一点。 - Asclepius
2
如何找到符号名称?我的编辑器会输出[pylint] C0111: Missing method docstring,因此找到代码编号很容易,但是找到符号名称意味着我必须查找它。 - Adam Parkin
1
请注意,Visual Studio Code现在显示符号名称而不是错误代码。 - Jean-Francois T.
显示剩余3条评论

92

有几种方法可以禁用 Pylint 的警告和错误。使用哪种方法取决于您希望如何在全局或本地应用禁用功能,这是一项重要的设计决策。

多种方法

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

这不仅涉及到 ~/.pylintrc 文件(在您的 $HOME 目录下),正如 Chris Morgan 所描述的那样。Pylint 将搜索 rc 文件,并优先考虑“更接近”的文件:

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

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

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

  • 如果您有一个不是 /root 的主目录:

    • ~/.pylintrc;或

    • ~/.config/pylintrc;或

    • /etc/pylintrc

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

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

[MESSAGES CONTROL]
disable=locally-disabled
  1. 像Aboo和Cairnarvon所描述的那样,可以通过pylint命令行进一步禁用。这看起来像这样: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(现在使用enable而不是disable)来停止抑制。

请注意,禁用单个行使用# pylint语法,而从此行开始禁用则使用# pragma pylint语法。这些很容易混淆,尤其是复制和粘贴时。

将所有内容放在一起

我通常使用这些方法的组合。

  • 我使用~/.pylintrc文件进行绝对全局标准控制 -- 这些非常少。

  • 当存在特定于项目的标准时,我在Python模块中使用项目级别的pylintrc文件。特别是当你从另一个人或团队接收代码时,你可能会发现他们使用了你不喜欢的惯例,但你不想重新制作代码。保持设置在这个级别有助于避免将这些实践传播到其他项目。

  • 我在单个源文件顶部使用块样式的pragma。我喜欢在开发高峰期关闭这些pragma(停止抑制消息)即使我不同意Pylint标准(例如“太少的公共方法” -- 我总是在自定义异常类上得到那个警告) -- 但在开发过程中看到更多/可能所有的Pylint消息很有帮助。这样你就可以找到你想要用单行pragma解决的情况(请参见下文),或者只需为下一个开发人员添加注释,以解释为什么这种警告在这种情况下是可以的。

  • 即使代码已准备好进行检查,我也会将一些块样式pragma禁用保


2
在大多数情况下,我不建议使用全局非空的~/.pylintrc。在我看来,配置通常应与项目绑定,因此必须将其放置在项目内的某个地方。只有这样才能对其进行版本控制并与项目共享。如果没有这样做,克隆可能缺少Pylint所需的自定义设置,无法退出而不打印消息。 - Asclepius
6
@ChrisJohnson 前缀 pragma 看起来完全没有必要。例如,我在文件顶部写了 # pylint: disable=missing-docstring,它适用于文件中剩余的所有内容。请检查并从您的答案中删除 pragma 前缀。 - Asclepius
2
Pylint FAQ没有关于任何编译指示的说明。(http://pylint.pycqa.org/en/latest/faq.html#is-there-a-way-to-disable-a-message-for-a-particular-module-only): 您可以通过在文件顶部添加相应选项的注释来禁用或启用(全局禁用)模块级别的消息: #pylint:disable =通配符导入,方法隐藏 #pylint:enable =太多行 - Yaroslav Nikitenko
“Pragma”在该文档的“消息控制”部分进行了讨论。 - Chris Johnson
@ChrisJohnson,# pylint: ... 注释被称为 pragma,但没有必要写成 # pragma pylint。在 Python 中,pragma 这个词不像在 C/C++ 中那样有任何特殊的含义。我认为这会让你的回答变得混乱,希望你能更新一下。总的来说:非常好的回答。 - wovano

32

这是一个常见问题解答

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消息的完整列表。该文档还提供了如何使用此功能的示例

30

您也可以使用以下命令:

pylint --disable=C0321  test.py

我的 Pylint 版本是 0.25.1。


3
这种技术现在已经过时了。建议使用禁用警告的符号名称代替。请参见此答案 - Asclepius
这个似乎也无法与 --py3k 标志一起使用 :( - DylanYoung
有趣的是,如果在“rc”文件中提供,它可以正常工作,并且(更令人困扰的是)它使用“--generate-rcfile”生成了一个正确的“rc”文件。多个分支执行相同操作的代码真是妙不可言 :( - DylanYoung

19

您只需要添加一行代码来禁用您想要禁用的内容。

例如,

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

在你的模块开头添加这个。


如果您不想概括,可以将“or”放在生成消息的行前面。 - arhuaco

4
如果有人需要帮助,使用 Visual Studio Code 时,它期望文件采用 UTF-8 编码。为了生成文件,我在 PowerShell 中运行了 pylint --generate-rcfile | out-file -encoding utf8 .pylintrc。请注意保留 HTML 标签。

4
< p >很抱歉偏离了最初的问题,关于发帖人的一般倾向,这个问题最好通过全局配置文件来解决。 但是,和许多受欢迎的答案一样,我更倾向于在我的代码中看到可能触发警告的内容,并最终通知贡献者
针对 @imolit的回答,我的评论需要简短,以下是一些详细信息。

对于multiple-statements 消息,最好在块级别或模块级别禁用它,如下所示:

# pylint: disable=multiple-statements

我现在使用attribute-defined-outside-init来进行unittest的setup(),我选择了一种行范围的消息禁用方式,使用消息代码来避免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__*

当然,您同样可以从代码中检索符号名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接