如何禁用 Pylint 警告?
Posted
技术标签:
【中文标题】如何禁用 Pylint 警告?【英文标题】:How do I disable a Pylint warning? 【发布时间】:2011-05-19 12:15:12 【问题描述】:我试图在 Pylint 0.21.1(如果重要的是: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=0321
或disable=C321
)被标记为错误,因此Pylint 确实正确识别该选项。它只是忽略它。
这是一个 Pylint 错误,还是我做错了什么?有没有办法解决这个问题?
我真的很想摆脱这些噪音。
【问题讨论】:
如果你想禁用一行代码,而不是所有的错误,有一个很好的solution here。 【参考方案1】: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=
行/s。
【讨论】:
谢谢,但它已经在 [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
,否则需要特别说明位置。【参考方案2】:
我在使用 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 中引发 KeyError 异常 (pylint.utils.MessagesHandlerMixIn.check_message_id()
。
在 Eclipse 中,您可以在 Pylint 控制台中看到此错误消息(windows* → show view → Console,从控制台旁边的控制台选项中选择 Pylint 控制台图标。)
【讨论】:
不,确实不应该。 1)它引用了 Eclipse,这与提出的问题无关 2)它建议通过遗留消息代码禁用。我会推荐my answer 以获得最简单的问题解决方案,或Chris Johnson's answer 以获得更多详细信息。 -1 创建全局配置文件是有害的,因为它会影响系统的所有用户。如果有的话,这应该是每个用户的配置文件,或者更好的是项目特定的配置文件。【参考方案3】:从 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
列出所有字符串
gist.github.com/omniproc/965bb613177dd4fa896b815aa0e0e365【参考方案4】:
要在块中本地禁用警告,请添加
# pylint: disable=C0321
到那个街区。
【讨论】:
这是一种遗留技术,不再推荐。查看其他答案。 您的意思是应该使用符号名称而不是代码编号,是吗? 是的。 answer by imolit 正好涵盖了这一点。 如何找到符号名称?我的编辑器会吐出[pylint] C0111: Missing method docstring
,所以找到代码很容易,但找到符号名称意味着我必须查找它。
请注意,Visual Studio Code 现在显示的是符号名称而不是错误代码。【参考方案5】:
有多种方法可以禁用 Pylint 的警告和错误。使用哪一个与您希望在全局或本地应用禁用的方式有关——这是一个重要的设计决策。
多种方法
-
在一个或多个
pylintrc
文件中。
这不仅仅涉及 Chris Morgan 所描述的 ~/.pylintrc
文件(在您的 $HOME 目录中)。 Pylint 将搜索 rc 文件,优先考虑“更接近”的文件:
当前工作目录中的pylintrc
文件;或
如果当前工作目录在 Python 模块中(即它包含一个 __init__.py
文件),则向上搜索 Python 模块的层次结构,直到找到一个 pylintrc
文件;或
环境变量PYLINTRC命名的文件;或
如果您的主目录不是/root
:
~/.pylintrc
;或
~/.config/pylintrc
;或
/etc/pylintrc
请注意,这些文件中的大多数都被命名为 pylintrc
-- 只有 ~
中的文件有一个前导点。
在您的 pylintrc
文件中,添加行以禁用特定的 pylint 消息。例如:
[MESSAGES CONTROL]
disable=locally-disabled
从 pylint
命令行进一步禁用,如 Aboo 和 Cairnarvon 所述。这看起来像pylint --disable=bad-builtin
。重复 --disable
以隐藏其他项目。
进一步禁用单个 Python 代码行,如 Imolit 所述。这些看起来像some statement # pylint: disable=broad-except
(原始源代码行末尾的额外注释)并且仅适用于当前行。我的方法是始终将它们放在其他代码行的末尾,这样它们就不会与块样式混淆,见下文。
为更大的 Python 代码块定义了进一步的禁用,直至完整的源文件。
这些看起来像 # pragma pylint: disable=bad-whitespace
(注意 pragma
关键字)。
这些适用于编译指示之后的每一行。将其中的一个块放在文件的顶部会使抑制应用于整个文件。将相同的块放在文件的较低位置使它们仅适用于该块之后的行。我的方法是始终将它们放在自己的一行中,这样它们就不会与单行样式混淆,见上文。
当抑制只适用于一段代码时,使用# pragma pylint: enable=bad-whitespace
(现在使用enable
而不是disable
)来停止抑制。
请注意,禁用单行使用# pylint
语法,而禁用该行以后使用# pragma pylint
语法。这些很容易混淆,尤其是在复制和粘贴时。
把它们放在一起
我通常混合使用这些方法。
我将~/.pylintrc
用于绝对的全球标准——其中很少。
当有项目特定的标准时,我在 Python 模块中的不同级别使用项目级别 pylintrc
。尤其是当您从其他人或团队获取代码时,您可能会发现他们使用您不喜欢的约定,但您不想重新编写代码。将设置保持在此级别有助于不将这些做法传播到其他项目。
我在单个源文件的顶部使用块样式编译指示。即使对于我不同意的 Pylint 标准(例如“公共方法太少”——我总是在自定义异常类上得到警告),我也喜欢在开发的热度中关闭编译指示(停止抑制消息)——但是在开发过程中查看更多/也许是所有 Pylint 消息会很有帮助。这样你就可以找到你想用单行编译指示解决的情况(见下文),或者只是为下一个开发人员添加 cmets 来解释为什么在这种情况下这个警告是可以的。
即使代码已准备好签入,我也会启用一些块样式的 pragma。我尝试使用其中的一些,但当它对模块有意义时,可以作为文档执行。不过我尽量少开,最好不开。
我使用单行注释样式来解决特别严重的错误。例如,如果有一个地方实际上可以使用except Exception as 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: enable=too-many-lines
Pragma 在该文档的“消息控制”部分进行了讨论。
@ChrisJohnson,# pylint: ...
cmets 被称为 pragma,但不需要写 # pragma pylint
。 pragma 这个词在 Python 中没有任何特殊含义,就像在 C/C++ 中一样。我认为这在您的回答中令人困惑,希望您能更新它。其余的:很好的答案?【参考方案6】:
这是FAQ:
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:E1101
、E1102
等
符号消息:no-member
、undefined-variable
等
一组检查的名称。您可以通过pylint --list-groups
获取。
检查类别:C
、R
、W
等
all
的所有检查。
请参阅 the documentation(或在终端中运行 pylint --list-msgs
)以获取 Pylint 消息的完整列表。该文档还提供了一个很好的example 说明如何使用此功能。
【讨论】:
【参考方案7】:您也可以使用以下命令:
pylint --disable=C0321 test.py
我的 Pylint 版本是 0.25.1。
【讨论】:
现在这是一种传统技术。建议使用禁用警告的符号名称。看到这个answer。 这似乎也不适用于--py3k
标志:(
有趣的是,如果在rc
文件中提供它,它可以正常工作,并且(更麻烦的是)它实际上会生成一个带有--generate-rcfile
的正确rc
文件。必须喜欢具有多个执行相同操作的分支的代码:(【参考方案8】:
您只需添加一行即可禁用您要禁用的内容。
例如,
#pylint: disable = line-too-long, too-many-lines, no-name-in-module, import-error, multiple-imports, pointless-string-statement, wrong-import-order
在模块的最开始添加这个。
【讨论】:
如果您不想概括,或者在生成消息的行前面。【参考方案9】:如果这对某人有帮助,如果您使用的是 Visual Studio Code,它希望文件采用 UTF-8 编码。为了生成文件,我在PowerShell 中运行了pylint --generate-rcfile | out-file -encoding utf8 .pylintrc
。
【讨论】:
【参考方案10】:很抱歉与最初的问题有点不同,关于海报的一般偏好,全局配置文件会更好地解决这个问题。 但是,与许多流行的答案一样,我倾向于在我的代码中查看可能触发警告的内容,并最终通知贡献者。 我对answer from @imolit 的评论需要保持简短,这里有一些细节。
对于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__*
当然,您同样可以从代码中检索符号名称。
【讨论】:
【参考方案11】:根据 Pylint 文档,最简单的方法是使用this chart:
C 约定相关检查 R 重构相关检查 W 各种警告 E 错误,代码中可能存在错误 F 致命,如果发生错误导致 Pylint 无法进行进一步处理。所以可以使用:
pylint -j 0 --disable=I,E,R,W,C,F YOUR_FILES_LOC
【讨论】:
【参考方案12】:Python 语法允许一行中有多个语句,用分号 (;) 分隔。但是,将每一行限制为一个语句可以让人们在阅读程序时更容易遵循程序的逻辑。
因此,解决此问题的另一种方法是了解 lint 消息存在的原因,而不是在一行中放置多个语句。
是的,您可能会发现每行编写多个语句更容易,但是,Pylint 不仅适用于您的代码的所有其他读者。
【讨论】:
【参考方案13】:编辑“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 警告?的主要内容,如果未能解决你的问题,请参考以下文章
来自 Pylint 的 Cell-var-from-loop 警告