- Notifications
You must be signed in to change notification settings - Fork97
Open
Labels
Milestone
Description
Summary
I've confirmed the following works in pyright, mypy, and pyrefly - but not in ty:
fromdataclassesimportdataclassfromtyping_extensionsimport (Callable,Generic,TypeVar,assert_type,)T=TypeVar("T")@dataclassclassAgent(Generic[T]):output_type:Callable[...,T]deffunc()->int:return1# pyright, mypy, pyrefly - works# ty - `Agent[int]` and `Agent[Unknown]` are not equivalent types + Expected `((...) -> T) | ((...) -> Awaitable[T])`, found `def func() -> int`assert_type(Agent(func),Agent[int])# worksassert_type(Agent[int](func),Agent[int])
I'm hoping to also getCallable[..., T] | Callable[..., Awaitable[T]]
to be inferred as the ultimate return type of the awaitable if an async function is passed rather than a regular one, but that's more tricky as it's ambiguous which side of the union should be matched. Note that pyright and pyrefly already handle this "correctly", but not mypy.
fromdataclassesimportdataclassfromtyping_extensionsimport (Awaitable,Callable,Generic,TypeVar,assert_type,)T=TypeVar("T")@dataclassclassAgent(Generic[T]):output_type:Callable[...,T]|Callable[...,Awaitable[T]]asyncdefcoro()->bool:returnTrue# mypy - error: Argument 1 to "Agent" has incompatible type "Callable[[], Coroutine[Any, Any, bool]]"; expected "Callable[..., Never] | Callable[..., Awaitable[Never]]" [arg-type]coro_agent=Agent(coro)# pyright, pyrefly - works# mypy - error: Expression is of type "Agent[Any]", not "Agent[bool]"# ty - `Agent[bool]` and `Agent[Unknown]` are not equivalent typesassert_type(coro_agent,Agent[bool])# worksassert_type(Agent[bool](coro),Agent[bool])
It would be great to see both work in ty, but I'm also open to suggestions to do the latter in a less ambiguous way!
- This is related to a new PydanticAI feature, if you're curious check outSupport functions as output_type, as well as lists of functions and other types pydantic/pydantic-ai#1785 (comment)
Version
ty 0.0.1-alpha.6