Sequence of types
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
The following works in pyright, but not in pyrefly, ty, or (which is why I'm here!) mypy:
from __future__ import annotations
from dataclasses import dataclass
from typing_extensions import (
Generic,
Sequence,
TypeVar,
assert_type,
)
T = TypeVar("T")
@dataclass
class Agent(Generic[T]):
output_type: Sequence[type[T]]
class Foo:
pass
class Bar:
pass
# pyright - works
# mypy - error: Expression is of type "Agent[object]", not "Agent[Foo | Bar]" [assert-type]
# pyrefly - assert_type(Agent[Foo], Agent[Bar | Foo]) failed + Argument `list[type[Bar] | type[Foo]]` is not assignable to parameter `output_type` with type `Sequence[type[Foo]]` in function `Agent.__init__`
# ty - `Agent[Foo | Bar]` and `Agent[Unknown]` are not equivalent types
assert_type(Agent([Foo, Bar]), Agent[Foo | Bar])
# pyright - works
# mypy - error: Expression is of type "Agent[Never]", not "Agent[int | str]" [assert-type]
# pyrefly - assert_type(Agent[int], Agent[str | int]) failed + Argument `list[type[str] | type[int]]` is not assignable to parameter `output_type` with type `Sequence[type[int]]` in function `Agent.__init__`
# ty - `Agent[int | str]` and `Agent[Unknown]` are not equivalent types
assert_type(Agent([int, str]), Agent[int | str])
# works
assert_type(Agent[Foo | Bar]([Foo, Bar]), Agent[Foo | Bar])
# works
assert_type(Agent[int | str]([int, str]), Agent[int | str])
It would be great to see this work in mypy, but if there's a good reason the other 2 out of 3 typecheckers also don't support this I'd love to understand why!
- This is related to a new PydanticAI feature, if you're curious check out https://github.com/pydantic/pydantic-ai/pull/1785#issuecomment-2905774110
- Issues for other type checkers:
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 eseguendo la riproduzione minima nell’issue e confronta i tipi inferiti da mypy con i casi parametrizzati esplicitamente. Analizza come l’inferenza dei costruttori generici gestisce Sequence[type[T]] quando l’argomento contiene più tipi. Il lavoro è completato quando le asserzioni per Agent([Foo, Bar]) e Agent([int, str]) non parametrizzati hanno esito positivo senza introdurre regressioni nei casi esistenti.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 35/100