Opcional, Unión y el Operador |
Las uniones expresan valores que pueden tomar múltiples tipos. La sintaxis X | Y (3.10+) reemplaza Union[X, Y]; los tipos anulables son uniones con None.
Busca en todas las páginas de la documentación
|Las uniones expresan valores que pueden tomar múltiples tipos. La sintaxis X | Y (3.10+) reemplaza Union[X, Y]; los tipos anulables son uniones con None.
def parse_count(raw: str | None) -> int:
if raw is None:
return 0
return int(raw)
def format_id(value: int | str) -> str:
return str(value)Cuándo usar esto:
from dataclasses import dataclass
@dataclass
class User:
id: int
email: str | None
def email_domain(user: User) -> str | None:
if user.email is None:
return None
return user.email.split("@", 1)[1]
def describe(value: int | str | None) -> str:
match value:
case None:
return "ausente"
case int(n):
return f"número {n}"
case str(s):
return f"texto {s}"
def coalesce(*values: str | None) -> str:
for v in values:
if v is not None:
return v
return ""
if __name__ == "__main__":
print(describe(42))
print(email_domain(User(1, None)))Lo que esto demuestra:
is None / is not None reduce los tipos opcionales para los verificadoresmatch/case con patrones tipados refina las unionesstr | None en argumentos variádicos para cadenas de respaldoNone explícitamente en el tipo de retornoOptional[T] significa T | None - todavía válido, | es el estilo preferido.mypy --strict advierte sobre miembros de unión no manejados en match.| Herramienta | Ejemplo |
|---|---|
is None | Opcional -> T |
isinstance | Miembros de unión |
match/case | Estructural + tipos |
assert | Pista solo para el verificador |
from typing import TypeGuard
def is_str_list(val: list[object]) -> TypeGuard[list[str]]:
return all(isinstance(x, str) for x in val)if email: trata la cadena vacía como ausente de manera diferente a is None. Solución: Elegir explícitamente la semántica de None o de valor "falsy".T | None oscurece los campos requeridos. Solución: Separar campos de modelo requeridos y opcionales.Any desde una rama de unión - Amplía el resultado. Solución: Tipo de retorno consistente por rama.null de JSON - Se mapea a None en Python - validar en el límite con Pydantic.| Alternativa | Usar Cuándo | No Usar Cuándo |
|---|---|---|
Tipos Result/Either | Canal de error explícito | Cuando las excepciones son idiomáticas |
Literal | Conjunto fijo de valores | Tipos de alcance abierto |
| Excepciones | Ausencia verdaderamente excepcional | Campo opcional esperado |
| Objeto centinela | Distinguir ausencia de None | Cuando Optional simple es suficiente |
Mismo significado - prefiere str | None en bases de código modernas de Python 3.10+.
isinstance, match, igualdad a None, o funciones TypeGuard.
isinstance(x, (int, str)) es válido en tiempo de ejecución; el verificador reduce en consecuencia.
field: str | None = None o Optional con valor predeterminado None.
int | None reemplaza Optional[int] - lectura más clara.
Incluir case _: o mypy puede advertir sobre uniones no manejadas bajo configuraciones estrictas.
User | Admin con un Protocol compartido o una clase base para campos comunes.
Los campos opcionales de Pydantic mapean null; documentar nullable de OpenAPI cuidadosamente.
assert x is not None reduce para mypy - operación nula en tiempo de ejecución si la optimización elimina los asserts (-O).
Refactorizar a una clase base, Protocol, o una unión discriminada con un campo de etiqueta literal.
matchVersiones de la Pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.
Revisado por Chris St. John·Última actualización: 16 jul 2026