Union allows a variable to hold multiple types. Optional is shorthand for Union with None.
1from typing import Union, Optional23# Union — multiple types4def process(value: Union[str, int]) -> str:5 if isinstance(value, int):6 return str(value)7 return value89process("hello") # "hello"10process(42) # "42"1112# Python 3.10+ syntax13def process(value: str | int) -> str:14 return str(value)1516# Optional — Union with None17def find_user(user_id: int) -> Optional[dict]:18 if user_id in users:19 return users[user_id]20 return None # Optional allows None2122# Python 3.10+ syntax23def find_user(user_id: int) -> dict | None:24 return users.get(user_id)2526# Complex unions27from typing import Literal2829Status = Literal["pending", "active", "deleted"]3031def update_status(status: Status) -> None:32 # Only accepts literal strings33 pass3435update_status("active") # OK36# update_status("unknown") # Error!
When to use:
Optional — function may return None.Union — argument accepts multiple types.Literal — argument must be specific values.