Skip to content

Comments

[flake8-bugbear] Fix B023 false positive for immediately-invoked lambdas#23294

Merged
charliermarsh merged 1 commit intoastral-sh:mainfrom
kar-ganap:fix/issue-7847
Feb 16, 2026
Merged

[flake8-bugbear] Fix B023 false positive for immediately-invoked lambdas#23294
charliermarsh merged 1 commit intoastral-sh:mainfrom
kar-ganap:fix/issue-7847

Conversation

@kar-ganap
Copy link
Contributor

Summary

Fixes #7847.

B023 (function-uses-loop-variable) currently flags lambdas that reference loop variables even when the lambda is immediately invoked (IIFE pattern). Since the closure is consumed right away, late-binding is not a concern and the diagnostic is a false positive.

This PR marks immediately-invoked lambdas as safe by checking func.is_lambda_expr() at the call site visitor, pushing the lambda into safe_functions so its body is not flagged.

Test Plan

Added test cases to B023.py covering several IIFE patterns:

for i in range(3):
    (lambda: i)()          # OK — immediately invoked
    (lambda x=i: x)()      # OK — default arg + immediately invoked
    print((lambda: i)())   # OK — nested in another call
    result = (lambda i=i: i * 2)()  # OK — default arg shadows

All existing B023 tests continue to pass. No snapshot changes needed (the new cases produce no diagnostics, as expected).

@charliermarsh charliermarsh added bug Something isn't working rule Implementing or modifying a lint rule labels Feb 15, 2026
@charliermarsh charliermarsh self-assigned this Feb 15, 2026
@astral-sh-bot
Copy link

astral-sh-bot bot commented Feb 15, 2026

ruff-ecosystem results

Linter (stable)

✅ ecosystem check detected no linter changes.

Linter (preview)

✅ ecosystem check detected no linter changes.

@charliermarsh charliermarsh merged commit ec03eac into astral-sh:main Feb 16, 2026
44 checks passed
carljm added a commit that referenced this pull request Feb 16, 2026
* main: (43 commits)
  [`ruff`] Suppress diagnostic for strings with backslashes in interpolations before Python 3.12 (`RUF027`) (#21069)
  [flake8-bugbear] Fix B023 false positive for immediately-invoked lambdas (#23294)
  [ty] Add `Final` mdtests for loops and redeclaration (#23331)
  [`flake8-pyi`] Also check string annotations (`PYI041`) (#19023)
  Remove AlexWaygood as a flake8-pyi codeowner (#23347)
  [ty] Add comments to clarify the purpose of `NominalInstanceType::class_name` and `NominalInstanceType::class_module_name` (#23339)
  Add attestations for release artifacts and Docker images (#23111)
  [ty] Fix `assert_type` diagnostic messages (#23342)
  [ty] Force-update all insta snapshots (#23343)
  Add Q004 to the list of conflicting rules (#23340)
  [ty] Fix `invalid-match-pattern` false positives (#23338)
  [ty] new diagnostic called-match-pattern-must-be-a-type (#22939)
  [ty] Update flaky projects  (#23337)
  [ty] Increase timeout for ecosystem report to 40 min (#23336)
  Bump ecosystem-analyzer pin  (#23335)
  [ty] Replace `strsim` with CPython-based Levenshtein implementation (#23291)
  [ty] Add mdtest for staticmethod assigned in class body (#23330)
  [ty] fix inferring type variable from string literal argument (#23326)
  [ty] bytes literal is a sequence of integers (#23329)
  Update rand and getrandom (#23333)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working rule Implementing or modifying a lint rule

Projects

None yet

Development

Successfully merging this pull request may close these issues.

B023 is emitted when closure is defined inside a loop and uses a variable from the same loop

2 participants