Skip to main content

Mandatory Python hints Enforcement

· 6 min read
Serhii Hrekov
software engineer, creator, artist, programmer, projects founder

This is a critical question for developers moving from dynamically-typed code to modern, type-hinted Python. The concise answer is: No, Python does not have mandatory type hints built into the language itself.

By default, the Python interpreter is dynamically typed and will ignore type hints entirely at runtime. However, you can make type hints mandatory and runtime-enforced by utilizing external tools and libraries.

The Fundamental Rule: Type Hints Are Advisory

Python's type hints, introduced in PEP 484, are strictly metadata. They are stored in the function's __annotations__ dictionary and are not checked or enforced by the interpreter when the code is run.

Example of Advisory Type Hints

def add_numbers(a: int, b: int) -> int:
"""Type hints suggest two integers are required."""
return a + b

# This call is WRONG according to the hints, but Python runs it without error.
# Python sees a 'str' and runs the string concatenation operation.
result = add_numbers("hello", "world")
print(f"Result: {result}, Type: {type(result)}")
# Output: Result: helloworld, Type: <class 'str'>

In this scenario, the type hint is only useful to static analysis tools (like MyPy or Pylance), which would flag the call to add_numbers("hello", "world") as a type violation before execution.


Making Type Hints Mandatory (Runtime Enforcement)

To make type hints behave as if they were mandatory (i.e., raising an error at runtime when an invalid type is passed), you must use third-party libraries designed for runtime validation.

Method 1: Data Validation Frameworks (e.g., Pydantic)

Libraries like Pydantic are widely used in frameworks like FastAPI. They parse function signatures and object definitions, automatically generating runtime validation logic. If an input type does not match the hint, a validation error is raised immediately.

ConceptUsageEnforcement
Model ValidationPydantic models validate data upon creation.If age is defined as int, passing None or a str raises a ValidationError.
FastAPI DependenciesFastAPI uses Pydantic/Starlette to validate all inputs (Path, Query, Body).A route expecting user_id: int will return a 422 Unprocessable Entity if the input is non-integer.
from pydantic import BaseModel, ValidationError

class User(BaseModel):
name: str # Hint is mandatory
age: int # Hint is mandatory

try:
# Pydantic enforces the 'age: int' hint at runtime
invalid_user = User(name="Alex", age="twenty-two")
except ValidationError as e:
print("--- Pydantic Enforcement ---")
print(e.errors()[0]['msg'])
# Output: Input should be a valid integer

Method 2: Runtime Type Checkers (e.g., Typeguard)

Libraries like typeguard use function decorators to wrap your code, performing immediate checks on all arguments and return values based on the hints provided.

# Installation: pip install typeguard
from typeguard import typechecked

@typechecked
def strict_add(a: int, b: int) -> int:
return a + b

try:
print("--- Typeguard Enforcement ---")
# Typeguard catches the violation at the function entrance
strict_add("one", "two")
except TypeError as e:
print(e)
# Output: type of argument "a" must be int; got str instead

How to Use Mandatory-Style Type Hints (Best Practices)

To write Python code where type hints are consistently checked and enforced:

AreaBest PracticeTool Used
API EndpointsUse FastAPI and Pydantic models for all data coming in via path, query, or body.FastAPI, Pydantic
Internal FunctionsUse a decorator library like @typechecked for core business logic functions where type safety is critical.Typeguard
DevelopmentAlways run a dedicated static type checker as part of your commit hooks or continuous integration (CI) pipeline.MyPy or Pyright (Pylance's core)

By combining a static checker during development with runtime validators (like Pydantic) for external data, you can achieve a level of type safety that effectively makes type hints mandatory throughout your application.

Sources and Further Reading

  1. Python Documentation - PEP 484 (Type Hints)
  2. Python Documentation - The typing module
  3. Pydantic Documentation - Core Concepts
  4. Typeguard Documentation - Runtime Type Checking
  5. FastAPI Documentation - Type Checking and Editor Support