From 22ce1a5d1377c38c37d3e1b815d930a57505b8b4 Mon Sep 17 00:00:00 2001 From: Pierre Sassoulas Date: Sat, 9 Apr 2022 19:27:37 +0200 Subject: [PATCH] Suppress `unsubscriptable-object` warnings in type-checking blocks (#5720) * Add a regression test for issue #3979 * Don't emit `unsubscriptable-object` for statements in type-checking blocks Co-authored-by: Jacob Walls --- ChangeLog | 5 +++++ doc/whatsnew/2.13.rst | 5 +++++ pylint/checkers/typecheck.py | 6 +++++- tests/functional/r/regression_02/regression_3979.py | 13 +++++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 tests/functional/r/regression_02/regression_3979.py diff --git a/ChangeLog b/ChangeLog index 7c630d6314..c1f81dc0c9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -44,6 +44,11 @@ Release date: TBA Closes #4020 +* Fix false positive for ``unsubscriptable-object`` in Python 3.8 and below for + statements guarded by ``if TYPE_CHECKING``. + + Closes #3979 + What's New in Pylint 2.13.7? ============================ diff --git a/doc/whatsnew/2.13.rst b/doc/whatsnew/2.13.rst index 5f3c866736..a71b781364 100644 --- a/doc/whatsnew/2.13.rst +++ b/doc/whatsnew/2.13.rst @@ -630,6 +630,11 @@ Other Changes Closes #6419 +* Fix false positive for ``unsubscriptable-object`` in Python 3.8 and below for + statements guarded by ``if TYPE_CHECKING``. + + Closes #3979 + * Fix a crash when linting a file that passes an integer ``mode=`` to ``open`` diff --git a/pylint/checkers/typecheck.py b/pylint/checkers/typecheck.py index a967cd4da6..f1ef99216c 100644 --- a/pylint/checkers/typecheck.py +++ b/pylint/checkers/typecheck.py @@ -1915,7 +1915,11 @@ def visit_subscript(self, node: nodes.Subscript) -> None: return # It would be better to handle function # decorators, but let's start slow. - if supported_protocol and not supported_protocol(inferred, node): + if ( + supported_protocol + and not supported_protocol(inferred, node) + and not utils.in_type_checking_block(node) + ): self.add_message(msg, args=node.value.as_string(), node=node.value) @check_messages("dict-items-missing-iter") diff --git a/tests/functional/r/regression_02/regression_3979.py b/tests/functional/r/regression_02/regression_3979.py new file mode 100644 index 0000000000..4fb0c5a051 --- /dev/null +++ b/tests/functional/r/regression_02/regression_3979.py @@ -0,0 +1,13 @@ +""" +Regression test for https://github.com/PyCQA/pylint/issues/3979 +""" + +import os +from typing import TYPE_CHECKING, Any, Union + +if TYPE_CHECKING: + BasePathLike = os.PathLike[Any] # <-- pylint used to emit E1136 here +else: + BasePathLike = os.PathLike + +foo: Union[str, BasePathLike] = "bar"