Type hints with user defined classes

PythonType HintingPython TypingUser Defined-Types

Python Problem Overview


Couldn't seem to find a definitive answer. I want to do a type hint for a function and the type being some custom class that I have defined, called it CustomClass().

And then let's say in some function, call it FuncA(arg), I have one argument named arg. Would the correct way to type hint FuncA be:

def FuncA(arg: CustomClass):

Or would it be:

from typing import Type

def FuncA(Arg:Type[CustomClass]):

Python Solutions


Solution 1 - Python

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]'

Solution 2 - Python

Willem Van Onsem's answer is of course correct, but I'd 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]):

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionhhprogramView Question on Stackoverflow
Solution 1 - PythonWillem Van OnsemView Answer on Stackoverflow
Solution 2 - PythonthisisrandyView Answer on Stackoverflow