如何禁用 Pylint 警告?
- 2025-02-28 08:22:00
- admin 原创
- 87
问题描述:
我正在尝试禁用 Pylint 0.21.1 中的警告 C0321(“一行上有多个语句”——我经常将if
具有较短的单行结果的语句放在同一行)(如果重要的话:astng 0.20.1、common 0.50.3 和 Python 2.6.6(r266:84292,2010 年 9 月 15 日,16:22:56))。
我尝试disable=C0321
在 Pylint 配置文件中添加,但 Pylint 坚持要报告它。该行的变体(如disable=0321
或disable=C321
)被标记为错误,因此 Pylint确实可以正确识别该选项。它只是忽略它。
这是 Pylint 错误吗?还是我做错了什么?有办法解决这个问题吗?
我真的很想消除一些噪音。
解决方案 1:
从 Pylint v. 0.25.3 开始,你可以使用符号名称来禁用警告,而不必记住所有这些代码号。例如:
# pylint: disable=locally-disabled, multiple-statements, fixme, line-too-long
这种风格比神秘的错误代码更有指导意义,也更实用,因为新版本的 Pylint 只输出符号名称,而不是错误代码。
禁用注释可以插入到其自己的行上,并将禁用应用于同一块中的所有内容。或者,也可以将其插入到要应用的行的末尾。
如果 Pylint 输出“ ”消息,您可以像上面的示例一样通过首先Locally disabling
包含禁用来摆脱它们。locally-disabled
解决方案 2:
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=
在某个部分内包含一行/多行[MESSAGES CONTROL]
。
解决方案 3:
我在使用Eclipse时遇到了这个问题,解决方法如下:
在pylint 文件夹(例如)中C:Python26Libsite-packagespylint
,按住Shift
,右键单击并选择在该文件夹中打开 windows 命令。输入:
lint.py --generate-rcfile > standard.rc
这将创建standard.rc
配置文件。在记事本中打开它[MESSAGES CONTROL]
,在 下取消注释disable=
并添加要禁用的消息 ID,例如:
disable=W0511, C0321
保存文件,然后在 Eclipse → Window → Preferences → PyDev → *pylint 的参数框中输入:
--rcfile=C:Python26Libsite-packagespylintstandard.rc
现在它应该可以工作了...
您还可以在代码顶部添加注释,Pylint 将对其进行解释:
# pylint: disable=C0321
Pylint 消息代码。
在参数框中添加例如--disable-ids=C0321
不起作用。
所有可用的 Pylint 消息都存储在字典中_messages
,它是类实例的一个属性pylint.utils.MessagesHandlerMixIn
。当使用参数运行 Pylint 时--disable-ids=...
(至少在没有配置文件的情况下),此字典最初为空,在 Pylint 中引发 KeyError 异常()pylint.utils.MessagesHandlerMixIn.check_message_id()
。
在 Eclipse 中,您可以在 Pylint 控制台中看到此错误消息(windows → show view → Console*,从控制台图标旁边的控制台选项中选择 Pylint 控制台。)
解决方案 4:
要在块中本地禁用警告,请添加
# pylint: disable=C0321
到那个街区。
解决方案 5:
有多种方法可以禁用 Pylint 的警告和错误。使用哪种方法取决于您希望全局还是局部应用禁用 - 这是一个重要的设计决策。
多种方法
在一个或多个
pylintrc
文件中。
这不仅仅涉及~/.pylintrc
Chris Morgan 描述的文件(位于您的 $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 之后的每一行**。将这些块放在文件顶部会使抑制适用于整个文件。将同一块放在文件较低位置会使它们仅适用于块后面的行。我的方法是始终将它们放在自己的一行上,这样它们就不会与单行样式混淆,请参见上文。
* 当抑制仅适用于代码范围时,使用`# pragma pylint: enable=bad-whitespace`(现在使用`enable`not `disable`)来停止抑制。
请注意,禁用单行使用# pylint
语法,而禁用此行以后使用# pragma pylint
语法。这些很容易混淆,尤其是在复制和粘贴时。
综合起来
我通常混合使用这些方法。
我使用
~/.pylintrc
绝对的全球标准——这些标准非常少。当存在特定于项目的标准时,我会在 Python 模块中的不同级别使用项目级别
pylintrc
。尤其是当您从其他人或团队那里获取代码时,您可能会发现他们使用了您不喜欢的约定,但您不想重新编写代码。将设置保持在此级别有助于避免将这些做法传播到其他项目。我在单个源文件的顶部使用块样式的指令。我喜欢在开发过程中关闭指令(停止抑制消息),即使对于我不同意的 Pylint 标准(例如“公共方法太少”——我总是在自定义异常类上收到该警告)——但在开发过程中查看更多/甚至所有 Pylint 消息很有帮助。这样,您就可以找到想要使用单行指令解决的情况(见下文),或者只需为下一位开发人员添加注释以解释为什么在这种情况下该警告是可以接受的。
即使代码已准备好签入,我也会保留一些块样式的指令。我尝试使用其中的几个,但当它对模块有意义时,可以将其用作文档。但是,我尝试保留尽可能少的指令,最好不保留。
我使用单行注释样式来处理特别严重的错误。例如,如果在某个地方确实需要执行
except Exception as exc
,我会在该行上放置 ,# pylint: disable=broad-except
而不是采用更全局的方法,因为这是一个奇怪的异常,需要将其调出,基本上是作为一种文档形式。
和 Python 中的其他所有东西一样,你可以在不同的间接层级上操作。我的建议是考虑什么属于哪个层级,这样你就不会对 Pylint 采取过于宽松的态度。
解决方案 6:
这是常见问题解答:
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
。
请参阅文档(或pylint --list-msgs
在终端中运行)以获取 Pylint 消息的完整列表。文档还提供了如何使用此功能的一个很好的示例。
解决方案 7:
您还可以使用以下命令:
pylint --disable=C0321 test.py
我的Pylint版本是0.25.1。
解决方案 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 编码。为了生成文件,我pylint --generate-rcfile | out-file -encoding utf8 .pylintrc
在PowerShell中运行。
解决方案 10:
*抱歉,关于发帖人的一般偏好,与最初的问题有点不同,最好通过全局配置文件来解决。但是,与许多流行的答案一样,我倾向于在我的代码中看到什么可能触发警告,并最终通知贡献者。我对 @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__*
当然,您也可以从代码中检索符号名称。
解决方案 11:
根据Pylint文档,最简单的方法是使用此图表:
C 约定相关检查
R 重构相关检查
W 各种警告
E 错误,代码中可能存在的错误
如果发生错误导致 Pylint 无法进一步处理,则会导致 F 致命。
因此可以使用:
pylint -j 0 --disable=I,E,R,W,C,F YOUR_FILES_LOC
解决方案 12:
在下一行禁用
除了其他答案之外:您还可以使用以下方法禁用下一行的通知,disable-next
例如,对于函数定义或一般的长行,这可能会派上用场:
# pylint: disable-next=dangerous-default-value
def find_zeros(my_list = []):
sum = 0
for element in list:
if element == 0:
sum += 1
return sum
解决方案 13:
Python 语法允许一行中有多个语句,以分号 (;) 分隔。但是,将每行限制为一个语句可以让人类在阅读时更容易理解程序的逻辑。
因此,解决这个问题的另一种方法是了解为什么会出现 lint 消息,并且不要在一行上放置多个语句。
是的,您可能会发现每行编写多个语句更容易,但是,Pylint 不仅适合您,还适用于代码的所有其他读者。
解决方案 14:
我pylint
一直忽略disable
我的列表中的内容.pylintrc
。最后,我意识到我正在执行:
pylint --disable=all --enable=F,E,W
它覆盖了disable
我的列表中的内容.pylintrc
。
仅显示致命错误和警告的正确命令是:
pylint --disable=C,R
解决方案 15:
编辑“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"
],
}
扫码咨询,免费领取项目管理大礼包!