Inferring parameter types and return type of a `type[T]`
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 20.6k
- Fork
- 3.3k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
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).
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia con il riproduttore Python minimo collegato e confronta l'output di mypy in modalità strict con i risultati reveal_type attesi per UserDatabase().create e user. Il lavoro è completato quando il type checker accetta la chiamata a create e inferisce i parametri del costruttore solo con keyword e il tipo restituito User senza l'errore invalid-self.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 42/100