python – Type hints with user defined classes

python – Type hints with user defined classes

The former is correct, if arg accepts an instance of CustomClass:

def FuncA(arg: CustomClass):
    #     ^ instance of CustomClass

In case you want the class CustomClass itself (or a subtype), then you should write:

from typing import Type  # you have to import Type

def FuncA(arg: Type[CustomClass]):
    #     ^ CustomClass (class object) itself

Like it is written in the documentation about Typing:

class typing.Type(Generic[CT_co])

A variable annotated with C may accept a value of type C. In
contrast, a variable annotated with Type[C] may accept values that
are classes themselves
– specifically, it will accept the class
object of C

The documentation includes an example with the int class:

a = 3         # Has type int
b = int       # Has type Type[int]
c = type(a)   # Also has type Type[int]

Willem Van Onsems answer is of course correct, but Id like to offer a small update. In PEP 585, type hinting generics were introduced in standard collections. For example, whereas we previously had to say e.g.

from typing import Dict

foo: Dict[str, str] = { bar: baz }

we can now forgo the parallel type hierarchy in the typing module and simply say

foo: dict[str, str] = { bar: baz }

This feature is available in python 3.9+, and also in 3.7+ if using from __future__ import annotations.

In terms of this specific question, it means that instead of from typing import Type, we can now simply annotate classes using the built-in type:

def FuncA(arg: type[CustomClass]):

python – Type hints with user defined classes

Leave a Reply

Your email address will not be published. Required fields are marked *