summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Walls <jacobtylerwalls@gmail.com>2022-05-01 11:48:26 -0400
committerPierre Sassoulas <pierre.sassoulas@gmail.com>2022-05-02 16:38:19 +0200
commit33a9aba4321f4b3fef8e9aefcfc9aa10abed1836 (patch)
tree3902d2e9d4b0577ca472fd5a51ec60bfce470c27
parentf6a0cfdbb682506b32fa0db7ffb08621fc711443 (diff)
downloadpylint-git-33a9aba4321f4b3fef8e9aefcfc9aa10abed1836.tar.gz
Fix false positive for `undefined-loop-variable` for lambda in first of two loops (#6479)
Co-authored-by: Pierre Sassoulas <pierre.sassoulas@gmail.com>
-rw-r--r--ChangeLog5
-rw-r--r--doc/whatsnew/2.13.rst5
-rw-r--r--pylint/checkers/variables.py5
-rw-r--r--tests/functional/u/undefined/undefined_loop_variable.py20
4 files changed, 34 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 2775fb3ad..c52bf9033 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -20,6 +20,11 @@ What's New in Pylint 2.13.8?
============================
Release date: TBA
+* Fix a false positive for ``undefined-loop-variable`` for a variable used in a lambda
+ inside the first of multiple loops.
+
+ Closes #6419
+
* Fix a crash when linting a file that passes an integer ``mode=`` to
``open``
diff --git a/doc/whatsnew/2.13.rst b/doc/whatsnew/2.13.rst
index ffac2c217..1d86a6fd9 100644
--- a/doc/whatsnew/2.13.rst
+++ b/doc/whatsnew/2.13.rst
@@ -620,6 +620,11 @@ Other Changes
Closes #5930
+* Fix a false positive for ``undefined-loop-variable`` for a variable used in a lambda
+ inside the first of multiple loops.
+
+ Closes #6419
+
* Fix a crash when linting a file that passes an integer ``mode=`` to
``open``
diff --git a/pylint/checkers/variables.py b/pylint/checkers/variables.py
index 9b2b2bd7a..2e4f4d70f 100644
--- a/pylint/checkers/variables.py
+++ b/pylint/checkers/variables.py
@@ -2205,7 +2205,10 @@ class VariablesChecker(BaseChecker):
# the usage is safe because the function will not be defined either if
# the variable is not defined.
scope = node.scope()
- if isinstance(scope, nodes.FunctionDef) and any(
+ # FunctionDef subclasses Lambda due to a curious ontology. Check both.
+ # See https://github.com/PyCQA/astroid/issues/291
+ # TODO: Revisit when astroid 3.0 includes the change
+ if isinstance(scope, nodes.Lambda) and any(
asmt.scope().parent_of(scope) for asmt in astmts
):
return
diff --git a/tests/functional/u/undefined/undefined_loop_variable.py b/tests/functional/u/undefined/undefined_loop_variable.py
index 956773e31..0270c6b53 100644
--- a/tests/functional/u/undefined/undefined_loop_variable.py
+++ b/tests/functional/u/undefined/undefined_loop_variable.py
@@ -103,3 +103,23 @@ bigger = [
]
for item in lst
]
+
+
+def lambda_in_first_of_two_loops():
+ """https://github.com/PyCQA/pylint/issues/6419"""
+ my_list = []
+ for thing in my_list:
+ print_it = lambda: print(thing) # pylint: disable=cell-var-from-loop
+ print_it()
+
+ for thing in my_list:
+ print(thing)
+
+
+def variable_name_assigned_in_body_of_second_loop():
+ for alias in tuple(bigger):
+ continue
+ for _ in range(3):
+ alias = True
+ if alias:
+ print(alias)