Pyright already effectively implements the behavior you're describing, so it wouldn't be a complexity burden for us to expose this with a `typing.Self` type. We use this technique whenever a `self` or `cls` parameter is unannotated. Internally, we synthesize a TypeVar that is bound to the class (even if that class is generic), and this synthesized type is applied to the unannotated `self` or `cls` parameter. This allows us to correctly infer return types in cases like this: ```python class A(Generic[T]): @classmethod def allocate(cls): return cls() class B(A[T]): pass val1 = A[int].allocate() reveal_type(val1) # pyright reveals: A[int], mypy reveals: Any val2 = B[float].allocate() reveal_type(val2) # pyright reveals: B[float], mypy reveals: Any ``` -Eric -- Eric Traut Contributor to Pyright & Pylance Microsoft Corp.