How to annotate a type that's a class object (instead of a class instance)?
To annotate an object that is a class, use typing.Type
. For example, this would tell the type checker that some_class
is class Foo
or any of its subclasses:
from typing import Type
class Foo: ...
class Bar(Foo): ...
class Baz: ...
some_class: Type[Foo]
some_class = Foo # ok
some_class = Bar # ok
some_class = Baz # error
some_class = Foo() # error
Note that Type[Union[Foo, Bar, Baz]]
and Union[Type[Foo], Type[Bar], Type[Baz]]
are completely equivalent.
If some_class
could be any of a number of classes, you may want to make them all inherit from the same base class, and use Type[BaseClass]
. Note that the inheritance must be non-virtual for now (mypy support for virtual inheritance is being discussed).
Edited to confirm that Type[Union[...
is allowed.