I want to allow type hinting using Python 3 to accept sub classes of a certain class. E.g.:
class A:
pass
class B(A):
pass
class C(A):
pass
def process_any_subclass_type_of_A(cls: A):
if cls == B:
# do something
elif cls == C:
# do something else
Now when typing the following code:
process_any_subclass_type_of_A(B)
I get an PyCharm IDE hint
Expected type A, got Type[B] instead.
How can I change type hinting here to accept any subtypes of A?
According to PEP 484 ("Expressions whose type is a subtype of a specific argument type are also accepted for that argument."), I understand that my solution (cls: A)
should work?
When you specify cls: A
, you're saying that cls
expects an instance of type A
.
For python 3.5.2 through 3.8, the type hint to specify cls
as a class object for the type A
(or its subtypes) uses typing.Type
.
from typing import Type
def process_any_subclass_type_of_A(cls: Type[A]):
pass
From The type of class objects:
Sometimes you want to talk about class objects that inherit from a given class. This can be spelled as
Type[C]
whereC
is a class. In other words, whenC
is the name of a class, usingC
to annotate an argument declares that the argument is an instance ofC
(or of a subclass ofC
), but usingType[C]
as an argument annotation declares that the argument is a class object deriving fromC
(orC
itself).
From python 3.9 onwards, it is recommended to use the builtin type
instead.
def process_any_subclass_type_of_A(cls: type[A]):
pass