Configuración de mypy y pyright
Los verificadores de tipos estáticos detectan errores antes de la ejecución. Configure mypy o pyright en pyproject.toml, ejecútelos en CI junto con ruff 0.9+ y ajuste la estrictez a medida que crece la cobertura.
Receta
# pyproject.toml
[tool.mypy]
python_version = "3.14"
warn_return_any = true
warn_unused_ignores = true
disallow_untyped_defs = false
[tool.pyright]
pythonVersion = "3.14"
typeCheckingMode = "basic"uv run mypy src/
uv run pyrightCuándo usar esto:
- Inicio de un nuevo servicio Python
- Refuerzo del pipeline de CI
- Monorepo con paquetes mixtos tipados/no tipados
- Comparación de mypy vs pyright en casos límite
Ejemplo Funcional
# Extracto de pyproject.toml para una aplicación con estructura src
[project]
name = "demo-app"
requires-python = ">=3.14"
[dependency-groups]
dev = ["mypy>=1.14", "pyright>=1.1.390", "ruff>=0.9"]
[tool.mypy]
python_version = "3.14"
packages = ["demo_app"]
namespace_packages = true
explicit_package_bases = true
warn_redundant_casts = true
warn_unused_ignores = true
pretty = true
[[tool.mypy.overrides]]
module = "tests.*"
disallow_untyped_defs = false
[tool.pyright]
include = ["src"]
exclude = ["**/__pycache__", "tests/fixtures"]
pythonVersion = "3.14"
typeCheckingMode = "standard"
reportMissingImports = true# .github/workflows/types.yml
name: types
on: [pull_request]
jobs:
mypy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v5
- run: uv sync --dev
- run: uv run mypy
- run: uv run pyrightLo que esto demuestra:
packages+explicit_package_basespara el descubrimiento de mypy en la estructura src- Las anulaciones por módulo relajan las pruebas mientras la aplicación se mantiene tipada
- El modo
standardde pyright es más estricto quebasic - CI ejecuta ambos verificadores cuando el equipo desea la máxima señal
Profundización
Cómo Funciona
- mypy - Verificador nominal incremental; potentes plugins de ecosistema (django, pydantic).
- pyright - Rápido; impulsa Pylance; bueno para repositorios grandes e inferencia estricta.
- Stubs - Paquetes
types-*en PyPI para bibliotecas de terceros no tipadas. - py.typed - Marcador PEP 561 en paquetes instalados que exportan tipos.
- ruff - Linter/formateador; separado de la verificación de tipos (aunque ruff tiene reglas limitadas conscientes de tipos).
Progresión de Estrictez
| Etapa | flags de mypy |
|---|---|
| 1 | warn_return_any |
| 2 | check_untyped_defs |
| 3 | disallow_untyped_defs por paquete |
| 4 | strict = true en nuevos módulos |
Notas de Python
# instalar stubs para requests
uv add --dev types-requests
# mypy archivo único
uv run mypy src/demo_app/main.py --show-error-codesErrores Comunes
- mypy no encuentra importaciones - Estructura src sin configuración
packages. Solución:mypy_patho configuración de paquete + instalación editable. - pyright no encuentra stubs - Informa tipos desconocidos. Solución: Instalar stubs o
reportMissingTypeStubs = falsetemporalmente. - Abuso de
# type: ignore- Oculta errores reales para siempre. Solución:warn_unused_ignoresy limpieza periódica. - Verificar site-packages de venv - Lento y ruidoso. Solución: Limitar
include/packagesa su código. - Resultados divergentes de mypy/pyright - Elegir el verificador principal; usar el secundario como asesor hasta que se alineen.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| solo pyright | Equipo de VS Code/Pylance | Se necesitan plugins específicos de mypy |
| solo mypy | Plugins de Django/mypy | Se desea paridad con Pylance |
| pytype | Stacks heredados de Google | Desarrollo nuevo |
| sin verificador | Script desechable | Servicios de producción |
Preguntas Frecuentes
¿mypy o pyright?
Muchos equipos ejecutan mypy en CI y pyright en el IDE a través de Pylance, o eligen un verificador en CI para empezar.
¿dónde vive la configuración?
Se prefiere pyproject.toml [tool.mypy] y [tool.pyright] sobre archivos ini dispersos.
¿estricto desde el primer día?
Generalmente demasiado ruidoso en proyectos existentes; ajustar módulo por módulo con anulaciones.
¿formato de type ignore?
# type: ignore[arg-type] códigos específicos - requerido en mypy moderno con show_error_codes.
¿plugin de mypy para pydantic?
El plugin de Pydantic 2 mejora la tipificación de modelos; habilitar en la configuración de mypy para proyectos FastAPI.
¿hook de pre-commit?
- repo: local
hooks:
- id: mypy
name: mypy
entry: uv run mypy
language: system
types: [python]¿paquetes de monorepo?
Anulaciones de mypy separadas por ruta de paquete o usar mypy -p package en la matriz de CI.
¿pin de python_version?
Coincidir con requires-python y la matriz de CI; 3.14 para este cookbook.
¿ruff reemplaza a mypy?
No - ruff formatea/linta como complemento; la verificación de tipos sigue siendo trabajo de mypy/pyright.
¿fallo de CI en advertencias?
Comenzar solo con errores; promover las advertencias a errores a medida que se reduce la deuda.
Relacionado
- Estrategia de Tipado Gradual - plan de implementación
- Conceptos Básicos de Type Hints - introducción a las anotaciones
- mypy y pyright en CI - hermano de la sección de linting
- Guía Rápida de Entornos Virtuales - dependencias de desarrollo uv
Versiones de 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+.