[英]How do I disable a Pylint warning?
我正在尝试在 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))。
我尝试在 Pylint 配置文件中添加disable=C0321
,但 Pylint 仍然坚持要报告它。 该行的变化(如disable=0321
或disable=C321
)被标记为错误,因此 Pylint确实正确识别该选项。 它只是忽略它。
这是一个 Pylint 错误,还是我做错了什么? 有没有解决的办法?
我真的很想摆脱一些这种噪音。
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=
line/s 。
从 Pylint v. 0.25.3 开始,您可以使用符号名称来禁用警告,而不必记住所有这些代码编号。 例如:
# pylint: disable=locally-disabled, multiple-statements, fixme, line-too-long
这种风格比神秘的错误代码更有指导意义,也更实用,因为新版本的 Pylint 只输出符号名称,而不是错误代码。
符号名称和代码之间的对应关系可以在这里找到。
禁用注释可以插入到它自己的行中,将禁用应用于同一块中后面的所有内容。 或者,它可以插入到要应用的行的末尾。
如果 Pylint 输出“ Locally disabling
disable”消息,您可以通过首先包含 disable locally-disabled
来摆脱它们,如上例所示。
我使用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
在参数框中添加例如--disable-ids=C0321
不起作用。
所有可用的 Pylint 消息都存储在字典_messages
中,它是pylint.utils.MessagesHandlerMixIn
类实例的属性。 当使用参数--disable-ids=...
运行 Pylint 时(至少没有配置文件),这个字典最初是空的,在 Pylint ( pylint.utils.MessagesHandlerMixIn.check_message_id()
中引发 KeyError 异常。
在 Eclipse 中,您可以在 Pylint 控制台中看到此错误消息(windows* →显示视图→控制台,从控制台图标旁边的控制台选项中选择 Pylint 控制台。)
要在块中本地禁用警告,请添加
# pylint: disable=C0321
到那个街区。
有几种方法可以禁用 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
如 Aboo 和 Cairnarvon 所述,从pylint
命令行进一步禁用。 这看起来像pylint --disable=bad-builtin
。 重复--disable
以抑制其他项目。
如 Imolit 所述,进一步禁用单个 Python 代码行。 这些看起来像some statement # pylint: disable=broad-except
(原始源代码行末尾的额外注释)并且仅适用于当前行。 我的方法是始终将它们放在其他代码行的末尾,这样它们就不会与块样式混淆,见下文。
为更大的 Python 代码块定义了进一步的禁用,直到完整的源文件。
这些看起来像# pragma pylint: disable=bad-whitespace
(注意pragma
关键字)。
这些适用于 pragma 之后的每一行。 将其中的一个块放在文件的顶部会使抑制应用于整个文件。 将相同的块放在文件的较低位置使它们仅适用于该块之后的行。 我的方法是始终将它们放在自己的一行上,这样它们就不会与单行样式混淆,见上文。
当抑制只适用于一段代码时,使用# pragma pylint: enable=bad-whitespace
(现在使用enable
not disable
)停止抑制。
请注意,禁用单行使用# pylint
语法,而禁用此行以后使用# pragma pylint
语法。 这些很容易混淆,尤其是在复制和粘贴时。
把它们放在一起
我通常混合使用这些方法。
我将~/.pylintrc
用于绝对的全球标准——其中很少。
当有特定于项目的标准时,我在 Python 模块中的不同级别使用项目级pylintrc
。 尤其是当您从其他人或团队接收代码时,您可能会发现他们使用了您不喜欢的约定,但您不想重新编写代码。 将设置保持在此级别有助于不将这些做法传播到其他项目。
我在单个源文件的顶部使用块样式编译指示。 即使对于我不同意的 Pylint 标准(例如“公共方法太少”——我总是在自定义异常类上得到警告),我也喜欢在开发的热度中关闭编译指示(停止抑制消息)——但是在开发过程中查看更多/也许是所有 Pylint 消息会很有帮助。 这样你就可以找到你想用单行编译指示解决的情况(见下文),或者只是为下一个开发人员添加注释来解释为什么在这种情况下这个警告是可以的。
即使代码准备好签入,我也会启用一些块式编译指示。我尝试使用其中的一些,但是当它对模块有意义时,可以作为文档来做。 但是我尽量少放,最好不要放。
我使用单行注释样式来解决特别严重的错误。 例如,如果有一个地方实际上将except Exception as exc
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
您可以通过以下方式禁用消息:
E1101
、 E1102
等。no-member
, undefined-variable
等。pylint --list-groups
来获取它们。C
, R
, W
等。all
检查。 有关 Pylint 消息的完整列表,请参阅文档(或在终端中运行pylint --list-msgs
)。 该文档还提供了一个很好的示例来说明如何使用此功能。
您还可以使用以下命令:
pylint --disable=C0321 test.py
我的 Pylint 版本是 0.25.1。
您只需添加一行即可禁用您要禁用的内容。
例如,
#pylint: disable = line-too-long, too-many-lines, no-name-in-module, import-error, multiple-imports, pointless-string-statement, wrong-import-order
在模块的最开始添加它。
如果这对某人有帮助,如果您使用的是Visual Studio Code ,它希望文件采用 UTF-8 编码。 为了生成文件,我运行了pylint --generate-rcfile | out-file -encoding utf8 .pylintrc
pylint --generate-rcfile | out-file -encoding utf8 .pylintrc
in PowerShell 。
很抱歉与最初的问题有所不同,关于海报的一般偏好,全局配置文件会更好地解决这个问题。 但是,就像在许多流行的答案中一样,我倾向于在我的代码中看到可能触发警告的内容,并最终通知贡献者。
我对@imolit 的回答需要简短,这里有一些细节。
对于multiple-statements
消息,最好在块或模块级别禁用它,如下所示
# pylint: disable=multiple-statements
我的用例现在是 unittest setup() 中的attribute-defined-outside-init
,我选择了行范围的消息禁用,使用消息代码来避免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文档,最简单的方法是使用此图表:
所以可以使用:
pylint -j 0 --disable=I,E,R,W,C,F YOUR_FILES_LOC
Python 语法允许在一行中有多个语句,用分号 (;) 分隔。 但是,将每一行限制为一个语句可以使人们在阅读程序时更容易遵循程序的逻辑。
因此,解决此问题的另一种方法是了解为什么存在 lint 消息并且不在一行中放置多个语句。
是的,您可能会发现每行编写多个语句更容易,但是,Pylint 不仅适用于您的代码的所有其他读者。
我的 pylint 一直忽略我的pylint
.pylintrc
的disable
列表。 最后,我意识到我正在执行:
pylint --disable=all --enable=F,E,W
它覆盖了我的.pylintrc
中的disable
列表。
仅显示致命、错误、警告的正确命令是:
pylint --disable=C,R
编辑“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"
],
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.