Skip to content

Conversation

@randolf-scholz
Copy link
Contributor

My idea is that we should only return the result of repl = repl.accept(self) if that result is no longer a TypeVarType, because if we are simply permuting the type variables, then this will be incorrect.

@github-actions
Copy link
Contributor

According to mypy_primer, this change doesn't affect type check results on a corpus of open source code. ✅

Comment on lines +251 to +254
if isinstance(expanded, TypeVarType):
expanded.default = expanded.default.accept(self)
else:
repl = expanded
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe more readable if done the other way round?

expanded = repl.accept(self)
if not isinstance(expanded, TypeVarType):
    repl = expanded
else:
    expanded.default = expanded.default.accept(self)

ilevkivskyi pushed a commit that referenced this pull request Oct 27, 2025
- Fixes #19444. (added `testTypeVarDefaultsSwap`)
- Fixes #19362 (added `testTypeVarDefaultsSwap2`)

Changed the logic for recursion guards of `TypeVarType`: Instead of
always substituting `repl = repl.accept(self)`, and situationally
updating `repl.default = repl.default.accept(self)` if the result is a
`TypeVarType`, we now always update `repl.default =
repl.default.accept(self)` a priori and then only choose the expanded
`repl.accept(self)` if the result is a concrete type.

## New Tests

- `testTypeVarDefaultsSwap`
(https://mypy-play.net/?mypy=1.17.0&python=3.12&gist=d5a025a31ae3c8b9e2a36f4738aa1991)
- `testTypeVarDefaultsSwap2`
(https://mypy-play.net/?mypy=1.17.0&python=3.12&gist=d3ed42c82f7144967c97d846c4c041ef)

PS: closed earlier PRs #19447, since it contained debugging changes, and
#19448 because it didn't solve #19362.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[PEP 696] Assigning to type variables with defaults gives unexpected results

1 participant