PyCQA / PyCQA/pyflakes

inconsistent behavior with locals(), comprehensions and the unused local variable warning

Open
#136 1 comment 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
1.5k
Forks
190
Avg merge
8m
Merged PRs (30d)
13

Description

Original report by fawio on Launchpad:


Hi,
As far as I know, bug 872503 (#142) was meant to fix the issue of code using locals() not being recognized as using local variables and indeed the code

# No warning
def test():
    a = 5
    return locals()

does not raise any warnings, but I've noticed that using locals() in the context of a comprehension (except a list comprehension) will incorrectly make pyflakes assume that the locals are not being used.

Using code as an example,

# No warning
def test():
    a = 5
    return [i for i in locals().values()]

does not raise a warning but the following generator expression:

# local variable 'a' is assigned to but never used
def test():
    a = 5
    return (i for i in locals().values())

set comprehension:

# local variable 'a' is assigned to but never used
def test():
    a = 5
    return {i for i in locals().values()}

and dict comprehension:

# local variable 'a' is assigned to but never used
def test():
    a = 5
    return {k: v for k, v in locals().items()}

all raise the unused local variable warning, which is pretty inconsistent with the previous behavior.

This is not a hugely critical bug but it's annoying and it could imply some bugs in the comprehensions elsewhere. Thanks for reading.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by running pyflakes on the four Python snippets in the issue and compare the warnings for list, generator, set, and dict comprehensions using locals(). Trace how locals() and comprehension scopes are handled, then verify that all examples receive consistent unused-variable behavior and add regression coverage where the project keeps analyzer tests.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
devtools
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.