python / python/mypy

Nondeterministic type-var error with LiteralString-bounded TypeVars

Offen
#20,528 3 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

After upgrading from mypy 1.19.0 to 1.19.1, we're experiencing nondeterministic type checking behavior:

  1. Without type: ignore[type-var]: Sometimes reports "Value of type variable 'S' of 'Response' cannot be 'object'" [type-var]
  2. 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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, das mitgelieferte Beispiel mit mypy 1.19.0 und 1.19.1 auszuführen, jeweils mit und ohne den Kommentar type: ignore[type-var], und vergleiche die Diagnosen. Lies PR #20345 und issue #20344 zum verwandten nichtdeterministischen Verhalten von Tuple-TypeVars; abgeschlossen ist die Aufgabe, wenn der durch LiteralString beschränkte TypeVar-Fall ein deterministisches, korrektes Ergebnis liefert.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
devtools
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.