diff options
author | Jacob Walls <jacobtylerwalls@gmail.com> | 2022-05-01 11:48:26 -0400 |
---|---|---|
committer | Pierre Sassoulas <pierre.sassoulas@gmail.com> | 2022-05-02 16:38:19 +0200 |
commit | 33a9aba4321f4b3fef8e9aefcfc9aa10abed1836 (patch) | |
tree | 3902d2e9d4b0577ca472fd5a51ec60bfce470c27 | |
parent | f6a0cfdbb682506b32fa0db7ffb08621fc711443 (diff) | |
download | pylint-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-- | ChangeLog | 5 | ||||
-rw-r--r-- | doc/whatsnew/2.13.rst | 5 | ||||
-rw-r--r-- | pylint/checkers/variables.py | 5 | ||||
-rw-r--r-- | tests/functional/u/undefined/undefined_loop_variable.py | 20 |
4 files changed, 34 insertions, 1 deletions
@@ -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) |