◐ Shell
clean mode source ↗

A way to spell "SelfType", the type of self

See python/mypy#1212. The proposal does not require changes to typing.py but it could benefit from words in PEP 484 requiring that this works.

The idea is simple: in an instance method, you can add a type annotation for self which is a type variable, and make the return type use that same type variable, e.g.

T = TypeVar('T', bound='Copyable')
class Copyable:
    def copy(self: T) -> T:
        # return a copy of self
class C(Copyable): ...
c = C()
c2 = c.copy()  # type here should be C

It should also work for class methods, using Type[], e.g.

T = TypeVar('T', bound='C')
class C:
    def factory(cls: Type[T]) -> T:
        # make a new instance of cls
class D(C): ...
d = D.factory()  # type here should be D

Note that the Python 2 annotation syntax already supports this, e.g.

T = TypeVar('T', bound='Copyable')
class Copyable:
    def copy(self):
        # type: (T) -> T
        # etc.

(IOW if you have a method with self and three arguments, you can give it either 3 or 4 arguments in the # type: comment, and if 4, the first will be used for self. Ditto for class methods.)