37
votes

I'm using Python 3 typing feature for better autocomplete.

Many times I have functions that return key/value (dictionary) with specific keys. super simple example:

def get_info(name):
    name_first_letter = name[0]
    return {'my_name': name, 'first_letter': name_first_letter}

I want to add type hinting to this function to tell others who use this function what to expect.

I can do something like:

 class NameInfo(object):
     def __init__(self, name, first_letter):
         self.name = name
         self.first_letter = first_letter

and then change the function signature to:

def get_info(name) -> NameInfo:

But it requires too much code for each dictionary.

What is the best practice in that case?

1
Have you considered using collections.namedtuple to create your custom types? It does make only immutable types, but depending on how you were using the dictionaries before, that might not be an issue. - Blckknght
You can also try to use Dict[str, str] type hint from typing module. - Stanislav Ivanov
@Blckknght thanks for remind me this option.Found exactly what i need. There is type named tuple docs.python.org/3/library/typing.html#typing.NamedTuple - Idok

1 Answers

34
votes

As pointed out by Blckknght, you and Stanislav Ivanov in the comments, you can use NamedTuple:

from typing import NamedTuple


class NameInfo(NamedTuple):
    name: str
    first_letter: str


def get_info(name: str) -> NameInfo:
    return NameInfo(name=name, first_letter=name[0])

Starting from Python 3.8 you can use TypedDict which is more similar to what you want:

from typing import TypedDict


class NameInfo(TypedDict):
    name: str
    first_letter: str


def get_info(name: str) -> NameInfo:
    return {'name': name, 'first_letter': name[0]}