Skip to content

Python Typing Guide

A beginner-friendly guide to Python type hints and typing concepts commonly used in modern Python projects.

This document focuses on the typing features frequently used in 42 Python modules and real-world applications.


Why Use Typing?

Type hints improve:

  • Code readability
  • Error detection
  • IDE autocompletion
  • Project maintainability
  • Static analysis with mypy

Typing makes code easier to understand and safer to maintain.


Basic Type Hints

Example

name: str = "Sara"
age: int = 20
height: float = 1.70
is_active: bool = True

Function Type Hints

Example

def add(a: int, b: int) -> int:
    return a + b

Explanation

  • a: int → parameter must be an integer
  • -> int → function returns an integer

list[str]

Used for lists containing only strings.

Example

names: list[str] = ["Sara", "John", "Alice"]

dict[str, int]

Dictionary where: - keys are strings - values are integers

Example

student_scores: dict[str, int] = {
    "Sara": 18,
    "John": 15
}

tuple[int, int]

Tuple with two integers.

Very common in: - game development - coordinates - maze projects - pathfinding systems

Example

position: tuple[int, int] = (5, 10)

Optional

Optional means a value can be: - a specific type - or None

Example

from typing import Optional

nickname: Optional[str] = None

Equivalent to:

nickname: str | None = None

Union

Union allows multiple possible types.

Example

from typing import Union

value: Union[int, str]

Equivalent to:

value: int | str

Any

Any disables type checking for a variable.

Example

from typing import Any

data: Any

Callable

Callable describes functions as types.

Example

from collections.abc import Callable

operation: Callable[[int, int], int]

Meaning: - accepts two integers - returns one integer


Callable Function Example

from collections.abc import Callable

def calculate(
    a: int,
    b: int,
    operation: Callable[[int, int], int]
) -> int:

    return operation(a, b)

Nested Typing

Typing structures can be combined.

Example

maze: list[list[int]]

A list containing lists of integers.


Complex Example

player_positions: dict[str, tuple[int, int]]

Dictionary: - key → player name - value → (x, y) coordinates


Common 42 Examples

Maze coordinates

position: tuple[int, int]

BFS queue

queue: list[tuple[int, int]]

Graph structure

graph: dict[str, list[str]]

Type Aliases

Useful for improving readability.

Example

Position = tuple[int, int]

player_position: Position
enemy_position: Position

Static Type Checking with mypy

mypy checks typing without running the code.

Run mypy

mypy .

Common mypy Errors

Missing return statement

def get_value() -> int:
    pass

Incompatible types

age: int = "hello"

Best Practices

  • Avoid unnecessary Any
  • Use precise types
  • Use Optional when needed
  • Keep function return types explicit
  • Prefer readable typing over overly complex typing

Summary Table

Typing Feature Purpose
list[str] List of strings
dict[str, int] Dictionary with string keys and integer values
tuple[int, int] Tuple with two integers
Optional[T] Type or None
Union[A, B] Multiple possible types
Any Disables type checking
Callable Function as a type

Final Notes

Typing is not only about satisfying mypy.

Good typing: - documents code - improves maintainability - helps teamwork - reduces bugs - makes large projects easier to manage