如何禁用Pylint警告?

时间:2010-12-03 01:41:05

标签: python pylint

我正在尝试禁用警告C0321(“在一行上多个语句” - 我经常在同一行上将if语句与短单行结果放在一起),在Pylint 0.21.1中(如果重要:到0.20.1,常见的0.50.3,Python 2.6.6(r266:84292,2010年9月15日,16:22:56))。

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

这是一个Pylint错误,还是我做错了什么?有没有办法解决?我真的想摆脱一些噪音。

13 个答案:

答案 0 :(得分:137)

我使用 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())内引发KeyError异常。 在Eclipse中,您可以在Pylint控制台中看到此错误消息(windows - show view - Console,从控制台图标旁边的控制台选项中选择Pylint控制台。)

答案 1 :(得分:129)

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]行/。

答案 2 :(得分:123)

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

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

这种风格比神秘的错误代码更有启发性,而且更实用,因为较新版本的Pylint只输出符号名称,而不是错误代码。

可以找到符号名称和代码之间的对应关系here

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

如果pylint输出“Locally disabling”消息,您可以通过首先包含禁用locally-disabled 来消除它们。如上例所示。

答案 3 :(得分:70)

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

# pylint: disable=C0321

到那个街区。

答案 4 :(得分:64)

有几种方法可以禁用警告& Pylint的错误。使用哪一个与您想要应用禁用的全局或本地方式有关 - 这是一个重要的设计决策。

多种方法

  1. 在一个或多个pylintrc个文件中。
  2. 这不仅仅包括Chris Morgan所描述的~/.pylintrc文件(在您的$ HOME目录中)。 Pylint将搜索rc文件,优先级为" close"文件更高:

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

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

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

    • 如果您的主目录不是/root

      • ~/.pylintrc;或

      • ~/.config/pylintrc;或

      • /etc/pylintrc

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

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

    [MESSAGES CONTROL]
    disable=locally-disabled
    
    1. 进一步禁用pylint命令行,如Aboo和Cairnarvon所述。这看起来像pylint --disable=bad-builtin。重复--disable以取消其他项目。

    2. 进一步禁用各个Python代码行,如Imolit所述。这些看起来像some statement # pylint: disable=broad-except(原始源代码行末尾的额外评论)和仅适用于当前行。我的方法是始终将这些放在其他代码行的末尾,这样他们就不会与块样式混淆,见下文。

    3. 为更大的Python代码块定义的进一步禁用,直到完整的源文件。

      • 这些看似# pragma pylint: disable=bad-whitespace(请注意pragma关键字)。

      • 这些适用于编译指示后的每一行。将这些块放在文件的顶部会使抑制应用于整个文件。将相同的块放在文件中较低的位置使它们仅适用于块后面的行。我的方法是始终把它们放在自己的线上,这样他们就不会对单线风格感到困惑,见上文。

      • 如果抑制仅适用于一段代码,请使用# pragma pylint: enable=bad-whitespace(现在使用enable而不是disable)来停止抑制。

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

      全部放在一起

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

      • 我使用~/.pylintrc作为绝对的全球标准 - 其中很少是。

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

      • 我在单个源文件的顶部使用块样式编译指示。我喜欢在开发的热度中关闭pragma(停止抑制消息),即使对于我不同意的Pylint标准(例如"太少的公共方法" - 我总是得到警告自定义异常类) - 但在您开发过程中查看更多/可能所有Pylint消息会很有帮助。通过这种方式,您可以使用单行编译指示找到要解决的案例(请参阅下文),或者只是为下一个开发人员添加注释,以解释在这种情况下警告可行的原因。

      • 即使代码已准备好签入,我也会启用一些块式pragma。我尝试使用其中的一些,但是当它对模块有意义时,它可以做文件。但是我试着尽可能少地离开,最好没有。

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

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

答案 5 :(得分:12)

您还可以使用以下命令:

pylint --disable=C0321  test.py

我的pylint版本是0.25.1。

答案 6 :(得分:8)

这是FAQ

  

4.1是否可以在本地禁用特定消息?

     

是的,此功能已添加到Pylint 0.11中。这可以通过以下方式完成   加入
  “#pylint:disable = some-message,another-one”在所需的位置   阻止级别或在所需代码行的末尾。

您可以按代码或符号名称禁用消息。有关pylint消息的完整列表,请参阅docs(或在终端中运行pylint --list-msgs)。
文档还提供了一个很好的example如何使用此功能。

答案 7 :(得分:2)

如果这对某人有帮助,如果您使用的是Visual Studio Code,则它希望该文件采用UTF8编码。为了生成文件,我在PowerShell中运行了CGSUnzoomPoint

答案 8 :(得分:2)

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

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

将此添加到模块的#1上

答案 9 :(得分:2)

根据 pylint 文档,最简单的方法是使用此chart

  • 与C约定相关的检查
  • R重构相关检查
  • 各种警告
  • E错误,可能是代码中的错误
  • 致命,如果发生错误而导致pylint无法进行进一步处理。

因此可以使用:

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

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

您可能想尝试一下:

编辑“ C:\ Users \您的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"
    ],
}

答案 12 :(得分:0)

很抱歉与最初的问题有所不同,关于发布者的一般偏好,这可以通过全局配置文件更好地解决。 但是,正如在许多流行的答案中一样,我倾向于在我的代码中查看可能触发警告的内容,并最终通知贡献者
我对 answer from @imolit 的评论需要简短,这里有一些细节。

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

# pylint: disable=multiple-statements

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

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