Conceptos básicos de las sugerencias de tipo
9 ejemplos para empezar con las sugerencias de tipo de Python: 6 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
9 ejemplos para empezar con las sugerencias de tipo de Python: 6 básicos y 3 intermedios.
uv add --dev mypy).Documenta los tipos esperados en nombres y firmas.
name: str = "Ada"
count: int = 0
def greet(user: str) -> str:
return f"Hello, {user}"__annotations__ pero no se aplican en tiempo de ejecución.-> None documenta que no hay un valor de retorno útil.Relacionado: Genéricos integrados y de colección - list[int], dict[str, int]
Usa genéricos integrados para contenedores (3.9+).
users: list[str] = []
index: dict[str, int] = {}
unique: set[int] = set()list sin parámetros significa una lista sin tipo para verificadores estrictos.tuple[int, str].Relacionado: Genéricos integrados y de colección - Sequence, Mapping
Los valores nulos usan la unión con None.
def find_user(user_id: int) -> dict | None:
return None
email: str | None = NoneOptional[str] es equivalente a str | None (estilo antiguo).if x is not None antes de usar; los verificadores refinan los tipos.Optional cuando None no está permitido.Relacionado: Opcional, Unión y el operador | - estrechamiento
Verifica tipos estáticamente en CI.
uv run mypy src/# fragmento de pyproject.toml
[tool.mypy]
python_version = "3.14"
strict = false
warn_return_any = truestrict = true.[tool.mypy] de pyproject.toml.Relacionado: Configuración de mypy y pyright - configuración completa
Combina comprobaciones en tiempo de ejecución con estrechamiento estático.
def handle(value: str | int) -> str:
if isinstance(value, str):
return value.upper()
return str(value * 2)isinstance ayuda a mypy/pyright a estrechar uniones.match/case también estrecha cuando los patrones son específicos del tipo.Relacionado: Opcional, Unión y el operador | - type guards
Any se excluye de la verificación; úsala con moderación.
from typing import Any
def legacy_bridge(payload: Any) -> dict[str, Any]:
assert isinstance(payload, dict)
return payloadAny es contagioso: los retornos infectan a los llamadores.object cuando se permite cualquier valor pero no operaciones arbitrarias.Any en los bordes del sistema con el tiempo.Tipa funciones de orden superior.
from collections.abc import Callable
def apply(fn: Callable[[int, int], int], a: int, b: int) -> int:
return fn(a, b)Callable[[ArgTypes], ReturnType] documenta la forma de la función.ParamSpec preserva las firmas de los decoradores (avanzado).Callable sobre funciones sin tipo en API públicas.Relacionado: Sobrecargas y tipos Callable - ParamSpec
Anota variables de instancia y de clase.
class Counter:
total: int = 0
def __init__(self) -> None:
self.value: int = 0__init__.ClassVar marca los atributos que no se anulan en las instancias.Relacionado: dataclasses - campos tipados
Añade tipos módulo por módulo.
# mypackage/service.py (tipado)
def compute(x: int) -> int:
return x + 1
# mypackage/legacy.py (sin tipo por ahora)
def legacy(): ...check_untyped_defs después de la cobertura base.# type: ignore[code] con moderación, comentando el porqué.Relacionado: Estrategia de tipado gradual - plan de implementación
Versiones de la pila: Esta página se escribió 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