summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniƫl van Noord <13665637+DanielNoord@users.noreply.github.com>2022-03-15 21:30:36 +0100
committerGitHub <noreply@github.com>2022-03-15 21:30:36 +0100
commit0481a7356140bb9506833d93149e1d219a3ec79f (patch)
tree467ccca86ece4da1b0abdacd2fd36ef72ff979ad
parent975550582494f9e1c0eb43336943c716120bc4e6 (diff)
downloadpylint-git-0481a7356140bb9506833d93149e1d219a3ec79f.tar.gz
Handle ``ComprehensionScope`` and their behaviour better (#5923)
-rw-r--r--pylint/checkers/classes/special_methods_checker.py5
-rw-r--r--pylint/checkers/typecheck.py10
-rw-r--r--pylint/checkers/utils.py5
3 files changed, 15 insertions, 5 deletions
diff --git a/pylint/checkers/classes/special_methods_checker.py b/pylint/checkers/classes/special_methods_checker.py
index 7eb61440d..d3d2b0935 100644
--- a/pylint/checkers/classes/special_methods_checker.py
+++ b/pylint/checkers/classes/special_methods_checker.py
@@ -289,6 +289,11 @@ class SpecialMethodsChecker(BaseChecker):
if isinstance(node, astroid.bases.Generator):
# Generators can be iterated.
return True
+ # pylint: disable-next=fixme
+ # TODO: Should be covered by https://github.com/PyCQA/astroid/pull/1475
+ if isinstance(node, nodes.ComprehensionScope):
+ # Comprehensions can be iterated.
+ return True
if isinstance(node, astroid.Instance):
try:
diff --git a/pylint/checkers/typecheck.py b/pylint/checkers/typecheck.py
index 8f5f35b6f..7cb132830 100644
--- a/pylint/checkers/typecheck.py
+++ b/pylint/checkers/typecheck.py
@@ -273,11 +273,11 @@ def _missing_member_hint(owner, attrname, distance_threshold, max_choices):
names = [repr(name) for name in names]
if len(names) == 1:
- names = ", ".join(names)
+ names_hint = ", ".join(names)
else:
- names = f"one of {', '.join(names[:-1])} or {names[-1]}"
+ names_hint = f"one of {', '.join(names[:-1])} or {names[-1]}"
- return f"; maybe {names}?"
+ return f"; maybe {names_hint}?"
MSGS = {
@@ -2047,10 +2047,10 @@ class IterableChecker(BaseChecker):
return False
def _check_iterable(self, node, check_async=False):
- if is_inside_abstract_class(node) or is_comprehension(node):
+ if is_inside_abstract_class(node):
return
inferred = safe_infer(node)
- if not inferred:
+ if not inferred or is_comprehension(inferred):
return
if not is_iterable(inferred, check_async=check_async):
self.add_message("not-an-iterable", args=node.as_string(), node=node)
diff --git a/pylint/checkers/utils.py b/pylint/checkers/utils.py
index f53ae8845..f8b7b74e3 100644
--- a/pylint/checkers/utils.py
+++ b/pylint/checkers/utils.py
@@ -1189,6 +1189,11 @@ def _supports_protocol(
if protocol_callback(value):
return True
+ # pylint: disable-next=fixme
+ # TODO: Should be covered by https://github.com/PyCQA/astroid/pull/1475
+ if isinstance(value, nodes.ComprehensionScope):
+ return True
+
if (
isinstance(value, astroid.bases.Proxy)
and isinstance(value._proxied, astroid.BaseInstance)