In Python 3.5, I'd like to use type hinting on a class method that returns a new instance of a class.
For example, I've got the following two classes:
class A:
@classmethod
def new_thing(cls):
return cls()
class B(A):
pass
I'd like to add a type hint to new_thing to specify that it returns an instance of the class it's called from.
The closest solution I've found is to use TypeVar, e.g.:
from typing import Type, TypeVar
T = TypeVar('T')
class A:
@classmethod
def new_thing(cls: Type[T]) -> T:
return cls()
However, this doesn't indicate any constraints on the type of cls, whereas cls should always be a instance of A or one of its subclasses (i.e. there's nothing to hint that cls should be callable here).
Is there some way to achieve this? TypeVar has a bound argument, so a first thought was:
T = TypeVar('T', bound=A)
but this doesn't work, as A isn't defined when the TypeVar is declared (and I can't declare A without the T first being defined).