summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Mueller <30130371+cdce8p@users.noreply.github.com>2021-10-05 13:07:53 +0200
committerGitHub <noreply@github.com>2021-10-05 13:07:53 +0200
commitf193806ed4eeb5d311523de54ff9fb83d64c57e9 (patch)
treeb976eeaf4b9e1b7f141b738486aee4d3e59efc19
parent92e48052c62163e6b8511f7497a9169f355d7164 (diff)
downloadpylint-git-f193806ed4eeb5d311523de54ff9fb83d64c57e9.tar.gz
Fix crash with AssignAttr in TYPE_CHECKING blocks (#5118)
-rw-r--r--ChangeLog4
-rw-r--r--pylint/checkers/variables.py4
-rw-r--r--tests/functional/u/undefined/undefined_variable.py10
3 files changed, 17 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index b93132399..f8619ab3b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -58,6 +58,10 @@ Release date: TBA
Closes #3614
+* Fix crash with ``AssignAttr`` in ``if TYPE_CHECKING`` blocks.
+
+ Closes #5111
+
What's New in Pylint 2.11.1?
============================
diff --git a/pylint/checkers/variables.py b/pylint/checkers/variables.py
index b2e38e113..b4027d602 100644
--- a/pylint/checkers/variables.py
+++ b/pylint/checkers/variables.py
@@ -1536,7 +1536,9 @@ class VariablesChecker(BaseChecker):
for definition in defstmt_parent.orelse:
if isinstance(definition, nodes.Assign):
defined_in_or_else = any(
- target.name == name for target in definition.targets
+ target.name == name
+ for target in definition.targets
+ if isinstance(target, nodes.AssignName)
)
if defined_in_or_else:
break
diff --git a/tests/functional/u/undefined/undefined_variable.py b/tests/functional/u/undefined/undefined_variable.py
index b4e1f8335..23cf1a31b 100644
--- a/tests/functional/u/undefined/undefined_variable.py
+++ b/tests/functional/u/undefined/undefined_variable.py
@@ -328,3 +328,13 @@ def decorated3(x):
@decorator(x * x * y for x in range(3)) # [undefined-variable]
def decorated4(x):
print(x)
+
+
+# https://github.com/PyCQA/pylint/issues/5111
+# AssignAttr in orelse block of 'TYPE_CHECKING' shouldn't crash
+# Name being assigned must be imported in orelse block
+if TYPE_CHECKING:
+ pass
+else:
+ from types import GenericAlias
+ object().__class_getitem__ = classmethod(GenericAlias)