Skip to content

Track conditional deletions in the semantic model#10415

Merged
charliermarsh merged 1 commit intomainfrom
charlie/del
Mar 15, 2024
Merged

Track conditional deletions in the semantic model#10415
charliermarsh merged 1 commit intomainfrom
charlie/del

Conversation

@charliermarsh
Copy link
Member

Summary

Given del X, we'll typically add a BindingKind::Deletion to X to shadow the current binding. However, if the deletion is inside of a conditional operation, we won't, as in:

def f():
    global X

    if X > 0:
        del X

We will, however, track it as a reference to the binding. This PR adds the expression context to those resolved references, so that we can detect that the X in global X was "assigned to".

Closes #10397.

@charliermarsh charliermarsh added the bug Something isn't working label Mar 15, 2024
@charliermarsh charliermarsh marked this pull request as ready for review March 15, 2024 00:23
@github-actions
Copy link
Contributor

ruff-ecosystem results

Linter (stable)

✅ ecosystem check detected no linter changes.

Linter (preview)

✅ ecosystem check detected no linter changes.

@charliermarsh charliermarsh merged commit 10ace88 into main Mar 15, 2024
@charliermarsh charliermarsh deleted the charlie/del branch March 15, 2024 00:45
dylwil3 added a commit that referenced this pull request Mar 21, 2026
… variables (#24088)

We already skip `F821` for things like this:

```python
x = 1
if cond:
    del x
print(x) # no diagnostic here
```

But when we checked for "conditional branches" we were only looking for
`match`, `if`, and `while` statements.

Here we also check for except handlers and `else` clauses. We continue
to regard `try` statements as "unconditionally executing" even though
that's not quite true.

Closes #6242

As an aside: I originally wanted to use the `BindingKind` variant
`ConditionalDeletion` introduced way back in #10415, but it turns out we
never actually constructed an instance of it! We could, if we ever
needed to track the "thing that was conditionally deleted". But since
that doesn't seem to have ever arisen in practice, I just got rid of the
variant and its references altogether.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PyLint false positive PLW0602 when del a global

1 participant