This article is part of in the series
Published: Tuesday 18th March 2025


banner image for python typing detailed tutorial

Python is dynamically typed. This means that the variables do not require explicit type declarations. Interestingly, with the introduction of type hints in Python version 3.5, you can now specify the expected types of function arguments, variables, and return values. Type hints improve your code's reliability, minimize debugging time, and helps with static analysis.

Today at PythonCentral, let us take you through Python's typing module, where we cover the basic first, then go to a little more advanced topics, best practices, and some use cases. Let's get learning.

What is Python Typing?

You probably expected this section if you are a regular patron of PythonCentral. We always start with the basics. Python typing is a feature that lets you add optional static typing to your code. While Python is still dynamically typed at runtime, type hints help tools like "mypy" to perform static type checking. This improves your code quality significantly.

Basic Type Annotations

Here are some of the most common type hints.

Variable Annotations

name: str = "Anna"
age: int = 25
height: float = 5.8
is_active: bool = True

Function Annotations

def greet(name: str) -> str:
return f"Hello, {name}!"

Here, "name: str" specifies that "name" should be a string, and "-> str" indicates the return type.

Complex Type Annotations

How to Use Lists and Tuples

Here is a sample syntax to use list and tuples

from typing import List, Tuple

def get_scores() -> List[int]:
return [90, 85, 88]

def get_coordinates() -> Tuple[float, float]:
return (12.34, 56.78)

How to Use Dictionaries and Sets

from typing import Dict, Set

def get_student_ages() -> Dict[str, int]:
return {"Alice": 25, "Bob": 30}

def get_unique_numbers() -> Set[int]:
return {1, 2, 3, 4}

How to Type Aliases and Optional Types

Here is How You Can Create Type Aliases

Type aliases simplify complex type definitions:

from typing import List

Vector = List[float]

def calculate_distance(v1: Vector, v2: Vector) -> float:
return sum((a - b) ** 2 for a, b in zip(v1, v2)) ** 0.5

How to Handle Optional Types

For using optional types, simply use "Optional" when a value can be "None". Here is a sample syntax to understand better:

from typing import Optional

def get_user_email(user_id: int) -> Optional[str]:
users = {1: "[email protected]", 2: "[email protected]"}
return users.get(user_id)

How to Use "Any", "Union", and "Callable" functions

Here is how you can use the "Any" type. "Any" type allows a variable to hold any type:

from typing import Any

def process_data(data: Any) -> None:
print(f"Processing: {data}")

If you want to use "Union" for multiple types, tweak this syntax according to your requirements. "Union" allows specifying multiple accepted types.

from typing import Union

def format_value(value: Union[int, float, str]) -> str:
return str(value)

Use this syntax to define function signatures with "Callable":

from typing import Callable

def execute_function(func: Callable[[int, int], int], a: int, b: int) -> int:
return func(a, b)

How to Use Generics for Reusing Code

Generics lets you define functions or classes that work with multiple types. As usual, let us give you an example so that you can tweak it and understand better.

from typing import TypeVar

T = TypeVar('T')

def identity(value: T) -> T:
return value

How to Use Mypy for Static Type Checking

To enforce type checking, install "mypy". Execute this command to install "mypy" via pip:

pip install mypy

To run type checks, execute this command:

mypy script.py

Best Practices for Python Typing

Keep these best practices in mind when you are working with Python typing:

  • Use type hints for function arguments and return values.
  • Leverage "Optional" for nullable values.
  • Use "Union" for multiple accepted types.
  • Apply "TypeVar" for generic functions.
  • Use "mypy" to validate type annotations.

Wrapping Up

Python’s typing module improves your code's maintainability, reduces runtime errors, and improves static analysis. By utilizing type hints effectively, you can write more robust and self-documenting code. We sincerely hope with this article you are now familiar with Python typing and you can now write cleaner, error-free, and well-documented code, ensuring better scalability and maintainability. Get. Set. Code!

Related Articles