python / python/mypy

`Literal["..."]`s incorrectly assignable to protocol with `__getitem__(slice) -> Self`

Offen
#20,058 0 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-literal-types topic-protocols
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug Report

Values of Literal["..."] types are incorrectly assignable to a protocol where __getitem__(slice) returns Self

To Reproduce

from typing import Protocol, Self, Literal

class Slicable(Protocol):
    def __getitem__(self, arg: slice, /) -> Self:
        ...

class Parser[X: Slicable]:
    def handle(self, input: X) -> tuple[X, X]:
        return input[:2], input[2:]

parser = Parser[Literal["banana"]]()
#^ no error, but expected: Literal['banana'] does not satisfy Slicable bound

left, right = parser.handle("banana")
reveal_type(left)  # revealed as: Literal['banana'], but 'ba' at runtime
reveal_type(right) # revealed as: Literal['banana'], but 'nana' at runtime

https://mypy-play.net/?mypy=1.18.2&python=3.14&flags=strict&gist=315731e775d05e4b59aa0105b8f96893

Literal["banana"] should not be assignable to Slicable, because slicing a Literal["banana"] produces LiteralString, not necessarily the type itself (which would only have to be Literal["banana"])

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

Führe die verknüpfte mypy-play-Reproduktion mit mypy 1.18.2 aus und verfolge anschließend, wie Protocol-Grenzen, ein Self zurückgebendes getitem und das Slicing von Literal-Strings geprüft werden. Erledigt ist die Aufgabe, wenn das Beispiel Literal["banana"] nicht mehr als Erfüllung von Slicable akzeptiert und die geslicten Ergebnisse nicht mehr als dieser Literal-Typ angezeigt werden.

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
45/100

Neue Issues direkt in Ihr Postfach

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