From 9b41f1454a2a1f16a0a8938d90c43cfd6aeb4be5 Mon Sep 17 00:00:00 2001 From: linhongkuan Date: Thu, 25 Jun 2026 02:26:20 +0800 Subject: [PATCH] Only honor noqa in comments --- src/flake8/violation.py | 17 ++++++++++++++++- tests/integration/test_main.py | 13 +++++++++++++ tests/unit/test_violation.py | 3 +++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/flake8/violation.py b/src/flake8/violation.py index 8535178..a26dc49 100644 --- a/src/flake8/violation.py +++ b/src/flake8/violation.py @@ -2,8 +2,10 @@ from __future__ import annotations import functools +import io import linecache import logging +import tokenize from re import Match from typing import NamedTuple @@ -16,7 +18,20 @@ LOG = logging.getLogger(__name__) @functools.lru_cache(maxsize=512) def _find_noqa(physical_line: str) -> Match[str] | None: - return defaults.NOQA_INLINE_REGEXP.search(physical_line) + if defaults.NOQA_INLINE_REGEXP.search(physical_line) is None: + return None + + try: + tokens = tokenize.generate_tokens(io.StringIO(physical_line).readline) + for token in tokens: + if token.type == tokenize.COMMENT: + match = defaults.NOQA_INLINE_REGEXP.search(token.string) + if match is not None: + return match + except (SyntaxError, tokenize.TokenError): + return defaults.NOQA_INLINE_REGEXP.search(physical_line) + + return None class Violation(NamedTuple): diff --git a/tests/integration/test_main.py b/tests/integration/test_main.py index 0ca5b63..0cad26e 100644 --- a/tests/integration/test_main.py +++ b/tests/integration/test_main.py @@ -240,6 +240,19 @@ t.py:1:15: E711 comparison to None should be 'if cond is None:' assert out == expected +def test_noqa_inside_string_literal_does_not_ignore_line(tmpdir, capsys): + """See https://github.com/pycqa/flake8/issues/1321.""" + with tmpdir.as_cwd(): + tmpdir.join("t.py").write("def f():\n x = '# noqa'\n") + assert cli.main(["t.py"]) == 1 + + expected = """\ +t.py:2:5: F841 local variable 'x' is assigned to but never used +""" + out, err = capsys.readouterr() + assert out == expected + + def test_specific_noqa_on_line_with_continuation(tmpdir, capsys): """See https://github.com/pycqa/flake8/issues/621.""" t_py_src = '''\ diff --git a/tests/unit/test_violation.py b/tests/unit/test_violation.py index 1b4852b..4edc40d 100644 --- a/tests/unit/test_violation.py +++ b/tests/unit/test_violation.py @@ -31,6 +31,9 @@ from flake8.violation import Violation ("ABC123", "a = 1 # noqa: ABC123", True), ("E111", "a = 1 # noqa: ABC123", False), ("ABC123", "a = 1 # noqa: ABC124", False), + ("E111", "a = '# noqa'", False), + ("E111", "a = '# noqa: E111'", False), + ("E111", "a = '# noqa' # noqa: E111", True), ], ) def test_is_inline_ignored(error_code, physical_line, expected_result):