python / python/typing

Allow `NotRequired[]` to be passed as a `TypeVar`

Offen
#1,323 2 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

topic: feature
Vorherrschende Sprache
Python
Sterne
1.8k
Forks
302
Ø Merge
23 Std.
Gemergte PRs (30 T.)
8

Beschreibung

I just found myself wanting to do the following:

from typing import TypedDict, NotRequired, Generic, TypeVar, Union, Never

_T = TypeVar('_T')

Foo = Union['FooSub1[_T]', 'FooSub2[_T]', 'FooSub3[_T]']

class BaseFoo(TypedDict, Generic[_T]):
    bar: _T

class FooSub1(BaseFoo[_T]):
    sub1: str

class FooSub2(BaseFoo[_T]):
    sub2: str

class FooSub3(BaseFoo[_T]):
    sub3: str

def foo(foo_with_bar: Foo[int]):
    reveal_type(foo_with_bar) # Type of "foo_with_bar" is "FooSub1[int] | FooSub2[int] | FooSub3[int]"

def bar(foo_without_bar: Foo[NotRequired[Never]]): # error: "NotRequired" is not allowed in this context
    pass

Mypy and Pyright both disallow NotRequired to be passed as a TypeVar. However the only way to avoid doing that would require me to duplicate all subclass definitions, which I am not willing to do because I have more than a dozen and so much duplication would make the code less maintainable.

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

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 mit dem Reproducer im Issue und vergleiche die aktuellen Regeln für NotRequired und TypeVar in mypy und Pyright, den beiden im Bericht genannten Checkern. Es sind keine Dateien oder Tests angegeben; abgeschlossen wäre die Arbeit erst mit einem abgestimmten Entwurf der Typisierungsregeln und dem entsprechenden Verhalten der Checker, ohne die TypedDict-Unterklassen zu duplizieren.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
tooling
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
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.