Nondeterministic type-var error with LiteralString-bounded TypeVars
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
After upgrading from mypy 1.19.0 to 1.19.1, we're experiencing nondeterministic type checking behavior:
- Without
type: ignore[type-var]: Sometimes reports "Value of type variable 'S' of 'Response' cannot be 'object'" [type-var] - With
type: ignore[type-var]: Sometimes reports "Unused 'type: ignore[type-var]' comment" [unused-ignore]
The error state is inconsistent and appears related to PR #20345 (which fixed issue #20344 about nondeterministic behavior with tuple type vars).
Environment
- Mypy version: 1.19.1
- Python version: 3.13
- Upgraded from: mypy 1.19.0 (no errors)
Example
Granted, this is a simplified, sanitized example I have extracted from our code base but I believe it highlights the case where the issue is happening
from typing import LiteralString
class Container[S: LiteralString, T]:
"""A container with a LiteralString key."""
def __init__(self, key: S, value: T) -> None:
self.key = key
self.value = value
class Response[S: LiteralString, T]:
"""A response parameterized by LiteralString."""
def __init__(self, container: Container[S, T]) -> None:
self.container = container
def process[S: LiteralString, S1: LiteralString](
containers: list[Container[S, int] | Container[S1, str]],
) -> dict[int, Response]:
"""Create responses from a union of containers with different LiteralString keys."""
return {
i: Response(container) # May error: type-var or unused-ignore
for i, container in enumerate(containers)
}
Scenario 1: With type: ignore[type-var] comment
example.py:28: error: Unused "type: ignore[type-var]" comment [unused-ignore]
Scenario 2: Without the comment (in different contexts)
Sometimes passes with no errors, sometimes shows:
example.py:28: error: Value of type variable "S" of "Response" cannot be "object" [type-var]
I'm not able to nail down exactly when each scenario surfaces but hopefully this is enough to go on as it otherwise presents as a regression since 1.19.0
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by running the supplied example with mypy 1.19.0 and 1.19.1, both with and without the type: ignore[type-var] comment, and compare the diagnostics. Read PR #20345 and issue #20344 for related nondeterministic tuple type-var behavior; done means the LiteralString-bounded TypeVar case produces a deterministic, correct result.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100