Sequence of types
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
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:
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by running the minimal reproduction in the issue and compare mypy's inferred types with the explicitly parameterized cases. Investigate how generic constructor inference handles Sequence[type[T]] when the argument contains multiple types. Done means the unparameterized Agent([Foo, Bar]) and Agent([int, str]) assertions pass without regressing the existing cases.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 35/100