Python 评论中的“#noqa”是什么意思?

What does '# noqa' mean in Python comments?

在搜索 Python 项目时,我发现有几行注释为 # noqa

import sys
sys.path.append(r'C:\dev')
import some_module   # noqa

noqa在Python中是什么意思?它仅特定于 Python 吗?

在一行中添加# noqa表示linter(一种自动检查代码质量的程序)不应该检查这一行。代码可能生成的任何警告都将被忽略。

该行可能 "looks bad" 对 linter 有影响,但开发人员出于某种原因理解并打算将其存在。

有关详细信息,请参阅 Flake8 documentation for Selecting and Ignoring Violations

noqa = NO-QA(无质量保证)

它通常用于 Python 代码中以忽略 PEP8 警告。

最后带有 #noqa 的行将被 linter 程序忽略并且不会引发任何警告。

你知道吗?甚至 Guido van Rossum(Python 的创造者)asked this question before :D

A bit Etymology of # noqa:

It used to be "nopep8" but when Flake8 and Pep8 wanted a common qualifier @florentx suggested "NoQA" as in "No Quality Assurance" (iirc) and it stuck.

Some basic usages of # noqa (with flake8):

  • # flake8: noqa: 包含这一行的文件被跳过
  • 包含# noqa评论末尾:不会发出警告
  • # noqa: <error>,例如# noqa: E234 末尾:忽略一行中的特定错误
    • 可以给出多个错误码,用逗号分隔
    • 代码列表前的冒号是必需的

在我正在使用的库中找到 #noqa 指令后来到这里。没听说过,自然是在Google上搜索到了这里。这里提供的答案是足够的,但我想为那些可能好奇的人提供一些进一步的阐述(我当然是)

  • # noqa 是从之前使用的 # nopep8 语法演变而来的 flake8

    的发布
  • # noqa 由 IDE 支持,如 PyCharm,用于它们的 内置代码检查工具。

  • # noqa 可以用作预提交指令,这样在 new 提交检查过程必须完成

  • # noqa可用于忽略所有警告或给出特定警告 无视。例如,# noqa: F401 将忽略未使用的 导入模块警告。

例如,考虑以下代码:

import os

print("Hello, world!")

此代码导入 os 模块但不使用它。如果想使用 # noqa 工具来抑制 PEP8 警告,可以这样写:

import os  # noqa

print("Hello, world!")

这将忽略所有 警告。但是,如果只想忽略特定警告(PEP8 F401 已导入但未使用),可以这样做:

import os  # noqa: F401

print("Hello, world!")

我发表了一篇文章,对上述几点进行了一些 noqa examples 和更多的阐述。