ChatGPT解决这个技术问题 Extra ChatGPT

如何禁用 Pylint 警告?

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

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

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

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

如果您想禁用单行代码,而不是所有类型的错误,则有一个很好的 solution here

C
Chris Morgan

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


谢谢,但它已经在上面显示的 [MESSAGES CONTROL] 部分中进行了。还是无视。
@Head Geek:好吧,它对我有用。 ~/.pylintrc 有两行,[MESSAGES CONTROL]disable=C0321。这会阻止该消息。
奇怪...完全相同的 PyLint 版本?
@Head Geek:实际上是 0.21.3,astng 0.20.3 和 common 0.52.1(我安装它时的最新版本,比你的更新版本)
如果您想拥有一个项目特定的 pylintrc,请确保将其命名为 pylintrc,否则需要特别说明该位置。
P
Peter Mortensen

从 Pylint v. 0.25.3 开始,您可以使用符号名称来禁用警告 instead of having to remember all those code numbers。例如:

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

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

符号名称与代码的对应关系见here

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

如果 Pylint 输出“Locally disabling”消息,您可以通过包含禁用 locally-disabled first 来摆脱它们,如上例所示。


但是把 # pylint: disable=foo inlyne 让我排队太长,所以现在我需要添加 , line-too-long!面面相觑;这就是我所需要的并解决了我的问题。谢谢!
我们可能会偏离最初的问题,即一般用户偏好,因此最好通过全局配置文件来解决。由于我更喜欢在我的代码中查看可能触发警告的内容,因此对于我当前的用例,我选择禁用行范围的消息,使用消息代码来避免 line-too-long 问题。可以使用 pylint --list-msgs | grep <code or keyword> 之类的命令在本地找到对应关系,请参阅 my answer 了解详细信息,因为注释需要保持简短。
@omni 提供的链接已失效。您可以键入 pylint --list-msgs 列出所有字符串
P
Peter Mortensen

我使用 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 message codes

在参数框中添加例如 --disable-ids=C0321 不起作用。

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

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


不,真的不应该。 1)它引用了 Eclipse,这与提出的问题无关 2)它建议通过遗留消息代码禁用。我会推荐 my answer 以获得最简单的问题解决方案,或 Chris Johnson's answer 以获得更多详细信息。
-1 创建全局配置文件是有害的,因为它会影响系统的所有用户。如果有的话,这应该是每个用户的配置文件,或者更好的是项目特定的配置文件。
t
thakis

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

# pylint: disable=C0321

到那个街区。


这是一种遗留技术,不再推荐。查看其他答案。
您的意思是应该使用符号名称而不是代码编号,是吗?
是的。 answer by imolit 正好涵盖了这一点。
如何找到象征性名称?我的编辑器会吐出 [pylint] C0111: Missing method docstring,所以找到代码很容易,但找到符号名称意味着我必须查找它。
请注意,Visual Studio Code 现在显示的是符号名称而不是错误代码。
A
Asclepius

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

多种方法

在一个或多个 pylintrc 文件中。

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

当前工作目录中的一个 pylintrc 文件;或者

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

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

如果你有一个不是 /root 的主目录:~/.pylintrc;或 ~/.config/pylintrc;或 /etc/pylintrc

~/.pylintrc;或者

~/.config/pylintrc;或者

/etc/pylintrc

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

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

[MESSAGES CONTROL]
disable=locally-disabled

如 Aboo 和 Cairnarvon 所述,从 pylint 命令行进一步禁用。这看起来像 pylint --disable=bad-builtin。重复 --disable 以抑制其他项目。如 Imolit 所述,进一步禁用单个 Python 代码行。这些看起来像一些语句 # pylint: disable=broad-except (原始源代码行末尾的额外注释)并且仅适用于当前行。我的方法是始终将它们放在其他代码行的末尾,这样它们就不会与块样式混淆,见下文。为更大的 Python 代码块定义了进一步的禁用,直到完整的源文件。这些看起来像 # pragma pylint: disable=bad-whitespace (注意 pragma 关键字)。这些适用于 pragma 之后的每一行。将其中的一个块放在文件的顶部会使抑制应用于整个文件。将相同的块放在文件的较低位置使它们仅适用于该块之后的行。我的方法是始终将它们放在自己的一行上,这样它们就不会与单行样式混淆,见上文。当抑制只应在代码范围内应用时,请使用 #pragma pylint: enable=bad-whitespace (现在使用启用而不是禁用)来停止抑制。

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

把它们放在一起

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

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

当有特定于项目的标准时,我在 Python 模块中的不同级别使用项目级 pylintrc。尤其是当您从其他人或团队接收代码时,您可能会发现他们使用了您不喜欢的约定,但您不想重新编写代码。将设置保持在此级别有助于不将这些做法传播到其他项目。

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

即使代码已准备好签入,我也会启用一些块样式的 pragma。我尝试使用其中的一些,但当它对模块有意义时,可以作为文档执行。但是我尽量少放,最好不要放。

我使用单行注释样式来解决特别严重的错误。例如,如果有一个地方实际上将except Exception 设置为exc 是有意义的,我将# pylint: disable=broad-except 放在该行而不是更全局的方法,因为这是一个奇怪的异常,需要调用出,基本上作为一种文档形式。

与 Python 中的其他所有内容一样,您可以在不同的间接级别上执行操作。我的建议是考虑什么属于什么级别,这样你就不会对 Pylint 采取过于宽松的方法。


在大多数情况下,我不提倡使用全局非空 ~/.pylintrc。恕我直言,配置通常应该与项目相关联,因此它必须位于项目中的某个位置。只有这样,它才能进行版本控制并与项目共享。如果不这样做,克隆可能缺少 pylint 退出而不打印消息所需的自定义。
@ChrisJohnson 前缀 pragma 似乎完全没有必要。例如,我的文件顶部有 # pylint: disable=missing-docstring,它适用于文件的整个其余部分。请检查并从您的答案中删除 pragma 前缀。
Pylint FAQ 没有写任何编译指示。 (pylint.pycqa.org/en/latest/…):您可以通过在文件顶部的注释中添加相应选项来在模块级别禁用或启用(全局禁用)消息:# pylint: disable=wildcard-import, method-hidden # pylint:启用=太多行
Pragma 在该文档的“消息控制”部分中进行了讨论。
@ChrisJohnson,# pylint: ... 评论是 称为 附注,但没有必要 write # pragma pylint . pragma 这个词在 Python 中没有任何特殊含义,就像在 C/C++ 中一样。我认为这在您的回答中令人困惑,希望您能更新它。其余的:很好的答案👍
P
Peter Mortensen

这是一个 FAQ

4.1 是否可以在本地禁用特定消息?是的,此功能已在 Pylint 0.11 中添加。这可以通过在所需的块级别或所需代码行的末尾添加 # pylint: disable=some-message,another-one 来完成。 4.2 有没有办法只禁用特定模块的消息?是的,您可以通过在文件顶部的注释中添加相应选项来在模块级别禁用或启用(全局禁用)消息:# pylint: disable=wildcard-import, method-hidden # pylint: enable=too-多行

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

数字 ID:E1101、E1102 等

符号消息:无成员、未定义变量等。

一组支票的名称。你可以使用 pylint --list-groups 来获取它们。

检查类别:C、R、W 等。

所有的支票。

有关 Pylint 消息的完整列表,请参阅 the documentation(或在终端中运行 pylint --list-msgs)。该文档还提供了如何使用此功能的一个很好的example


P
Peter Mortensen

您还可以使用以下命令:

pylint --disable=C0321  test.py

我的 Pylint 版本是 0.25.1。


这现在是一种传统技术。建议使用禁用警告的符号名称。请参阅此answer
这似乎也不适用于 --py3k 标志:(
有趣的是,如果在 rc 文件中提供它就可以正常工作,而且(更麻烦的是)它实际上会生成一个带有 --generate-rcfile 的正确 rc 文件。必须喜欢具有多个执行相同操作的分支的代码:(
P
Peter Mortensen

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

例如,

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

在模块的最开始添加它。


或者如果您不想一概而论,则在生成消息的行前。
P
Peter Mortensen

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


R
RockyRoad

很抱歉与最初的问题有点不同,关于海报的一般偏好,全局配置文件会更好地解决这个问题。但是,与许多流行的答案一样,我倾向于在我的代码中查看可能触发警告的内容,并最终通知贡献者
我对 {1 } 需要保持简短,这里有一些细节。

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

# pylint: disable=multiple-statements

我的用例现在 attribute-defined-outside-init 在 unittest setup() 中,我选择禁用 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__*

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


P
Peter Mortensen

根据 Pylint 文档,最简单的方法是使用 this chart

C 约定相关的检查

重构相关检查

各种警告

错误,用于代码中可能的错误

致命,如果发生错误导致 Pylint 无法进行进一步处理。

所以可以使用:

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

P
Peter Mortensen

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

因此,解决此问题的另一种方法是了解为什么存在 lint 消息并且不在一行中放置多个语句。

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


w
wisbucky

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

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

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

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

pylint --disable=C,R

a
aarw76

编辑“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"
    ],
}