Inferring parameter types and return type of a `type[T]`
Offen
Dieses Issue hat noch niemand übernommen.
feature
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
From this discussion at @microsoft/pyright:
@dataclass(kw_only = True) class User: id: int name: str class HasCls[**P, T](Protocol): cls: Callable[P, T] class Repository[T]: cls: type[T] def __init__(self, cls: type[T]) -> None: ... def create[**P](self: HasCls[P, T], *args: P.args, **kwargs: P.kwargs) -> T: ... class UserDatabase(Repository[User]): def __init__(self) -> None: ...Expected:
user = UserDatabase().create(id = 1, name = 'foo') # fine reveal_type(UserDatabase().create) # (*, id: int, name: str) -> User reveal_type(user) # User
# error: Invalid self argument "UserDatabase" to attribute function "create" with type "Callable[[HasCls[P, T], **P], T]" [misc]
user = UserDatabase().create(id = 1, name = 'foo')
reveal_type(UserDatabase().create) # (*args: Never, **kwargs: Never) -> User
reveal_type(user) # User
The pattern above is supported by Pyright, if not for a bug that this snippet helped discovering (which has since been fixed).
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit dem verknüpften minimalen Python-Reproduzierer und vergleiche die Ausgabe von mypy im strict mode mit den erwarteten reveal_type-Ergebnissen für UserDatabase().create und user. Die Arbeit ist abgeschlossen, wenn der Typechecker den create-Aufruf akzeptiert und die schlüsselwort-only Konstruktorparameter sowie den Rückgabetyp User ohne den invalid-self-Fehler ableitet.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 42/100