ruff
e8678308 - [ty] Don't include already-bound legacy typevars in function generic context (#19558)

Commit
70 days ago
[ty] Don't include already-bound legacy typevars in function generic context (#19558) We now correctly exclude legacy typevars from enclosing scopes when constructing the generic context for a generic function. more detail: A function is generic if it refers to legacy typevars in its signature: ```py from typing import TypeVar T = TypeVar("T") def f(t: T) -> T: return t ``` Generic functions are allowed to appear inside of other generic contexts. When they do, they can refer to the typevars of those enclosing generic contexts, and that should not rebind the typevar: ```py from typing import TypeVar, Generic T = TypeVar("T") U = TypeVar("U") class C(Generic[T]): @staticmethod def method(t: T, u: U) -> None: ... # revealed: def method(t: int, u: U) -> None reveal_type(C[int].method) ``` This substitution was already being performed correctly, but we were also still including the enclosing legacy typevars in the method's own generic context, which can be seen via `ty_extensions.generic_context` (which has been updated to work on generic functions and methods): ```py from ty_extensions import generic_context # before: tuple[T, U] # after: tuple[U] reveal_type(generic_context(C[int].method)) ``` --------- Co-authored-by: Carl Meyer <carl@astral.sh> Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Author
Parents
Loading