Los errores de Python caen en tres categorías distintas - sintaxis, tiempo de ejecución y lógica - y la herramienta correcta para cada una es diferente. Un verificador de sintaxis detecta problemas estructurales antes de que el intérprete ejecute una sola línea; un explicador de tracebacks decodifica la cadena de llamadas tras surgir una excepción; un analizador estático como Flake8 o mypy encuentra bugs que ninguno de los dos enfoques ve. Esta guía mapea cada categoría de error de Python a la mejor herramienta para detectarla, con flujos de trabajo para desarrollo local, el editor y CI/CD.
Tipos de errores de Python
Cada error de Python pertenece a una de tres categorías, y saber con cuál tratas te dice de inmediato qué herramienta usar. Confundirlas lleva a gastar diez minutos ejecutando un verificador de sintaxis sobre un problema de ejecución, o a montar un verificador de tipos para resolver un error puro de indentación. Las categorías son distintas a nivel del intérprete - cada una aparece en una etapa diferente de la ejecución.
Errores de sintaxis y de indentación
Python lanza un `SyntaxError` o `IndentationError` en tiempo de análisis - antes de generar un solo byte de bytecode. El intérprete lee el archivo fuente, construye un árbol de sintaxis abstracta y se detiene de inmediato si la estructura viola la gramática de Python. Desencadenantes comunes: dos puntos faltantes tras `def`, `class`, `if` o `for`; paréntesis o corchetes sin cerrar; mezclar tabs y espacios en el mismo bloque; o usar una palabra reservada como nombre de variable. El mensaje de error incluye el nombre del archivo, el número de línea y un cursor señalando el token inesperado.
Excepciones en tiempo de ejecución
Las excepciones en tiempo de ejecución se lanzan durante la ejecución cuando código sintácticamente válido intenta una operación ilegal. Las más comunes: `TypeError` (llamar a algo no invocable, pasar tipos de argumento incorrectos), `AttributeError` (acceder a un método o atributo que no existe en un objeto), `NameError` (referenciar una variable nunca asignada), `KeyError` (acceder a una clave de dict que no está presente) e `IndexError` (referenciar una posición de lista fuera de rango). Estas requieren un entorno en ejecución, un stack trace o un análisis estático cuidadoso para detectarse.
Errores de lógica
Los errores de lógica producen una salida incorrecta sin lanzar ninguna excepción. Un off-by-one en un rango, un argumento por defecto mutable que acumula estado entre llamadas, una copia superficial donde se pretendía una profunda - son invisibles para todo verificador de sintaxis y para la mayoría de analizadores estáticos. Solo se encuentran ejecutando el código con datos de prueba representativos, escribiendo pruebas unitarias o revisando la lógica manualmente.
- SyntaxError: Estructura incorrecta - dos puntos faltantes, corchete sin cerrar, token inválido. Detectado en tiempo de análisis.
- IndentationError: Espaciado inconsistente - tabs y espacios mezclados, o un bloque indentado a un nivel imposible.
- TypeError: Tipo incorrecto - pasar una cadena donde se espera un número, llamar a un entero.
- NameError: Nombre indefinido - referenciar una variable antes de asignarla o escribir mal un nombre de función.
- AttributeError: Atributo faltante - llamar a `.split()` en un entero, acceder a un atributo eliminado.
- Bug de lógica: Salida incorrecta, sin excepción - requiere pruebas, un depurador o revisión manual cuidadosa.
Note
Verificadores de sintaxis de Python
Un verificador de sintaxis de Python valida la estructura de tu código sin ejecutarlo y reporta cada lugar donde el fuente viola la gramática de Python. Es la comprobación inicial más rápida y segura - resultados en milisegundos, sin efectos secundarios y sin depender de tener un entorno Python funcional configurado localmente.
Cuándo usar un verificador de sintaxis
Los verificadores de sintaxis valen su precio en cuatro situaciones: cuando recibes Python de un tercero (código generado, un fragmento de documentación, un archivo de un colaborador), cuando escribes Python en un editor sin soporte de language server, cuando necesitas una comprobación rápida sobre un script muy editado antes de hacer commit, y cuando depuras un script que no arranca sin salida útil en la terminal.
Verificación de sintaxis integrada con py_compile
Python incluye un verificador de sintaxis que no requiere instalación adicional. Ejecuta `python -m py_compile yourfile.py` - si el comando termina en silencio, la sintaxis es válida. Si hay un problema, imprime el nombre del archivo, el número de línea y el tipo de error. Para comprobar varios archivos a la vez, `python -m compileall src/` recorre un árbol de directorios y reporta cada error de sintaxis que encuentra.
# Check a single file - exits silently if valid
python -m py_compile myscript.py
# Check all .py files in a directory tree
python -m compileall src/
# Verbose output - shows each file checked
python -m compileall -v src/
# Check without writing .pyc bytecode files
python -m compileall -b src/Verificación de sintaxis en el navegador
El validador de sintaxis de Python de Aback Tools funciona completamente en tu navegador. Pega cualquier script de Python - sin importar su longitud - y obtén diagnósticos a nivel de línea para errores de indentación, tokens sin pareja, cadenas sin terminar y problemas estructurales en menos de un segundo. Tu código nunca se sube a un servidor, lo que lo hace seguro para scripts propietarios, herramientas internas y código de aplicación confidencial.
| Comprobación | Validador de sintaxis | Flake8 | Pylint | mypy |
|---|---|---|---|---|
| Dos puntos / corchete faltante | ✓ Sí | ✓ Sí | ✓ Sí | ✓ Sí |
| IndentationError | ✓ Sí | ✓ Sí | ✓ Sí | ✓ Sí |
| Variable indefinida (NameError) | ✗ No | ✓ pyflakes | ✓ Sí | ✓ Sí |
| Import sin usar | ✗ No | ✓ pyflakes | ✓ Sí | ⚠ Parcial |
| Tipo incorrecto | ✗ No | ✗ No | ⚠ Parcial | ✓ Sí |
| Violaciones de estilo PEP 8 | ✗ No | ✓ pycodestyle | ✓ Sí | ✗ No |
| Lógica / salida incorrecta | ✗ No | ✗ No | ✗ No | ✗ No |
Validador de sintaxis de Python
Comprueba scripts de Python en busca de errores de sintaxis e indentación al instante - local en el navegador, diagnósticos por línea, sin subida.
Leer tracebacks de Python
Un traceback de Python es el registro del intérprete de cómo la ejecución llegó al punto donde se lanzó una excepción. Leerlo con eficiencia - en lugar de entrar en pánico ante el muro de texto - es una de las habilidades de depuración de mayor rendimiento en Python. El traceback te dice exactamente dónde se originó el error y cada llamada de función que llevó hasta allí.
Anatomía de un traceback de Python
Un traceback comienza con la línea `Traceback (most recent call last):` y lista los marcos desde la llamada más externa arriba hasta el lugar del error abajo. Cada marco muestra la ruta del archivo, el número de línea, el nombre de la función y la línea de código fuente. Las dos últimas líneas muestran la clase de excepción y su mensaje - ese es el error real. Lee de abajo hacia arriba: entiende primero el tipo de error, luego rastrea la cadena de llamadas hacia arriba para encontrar dónde en tu código se originó el valor problemático.
Traceback (most recent call last):
File "main.py", line 42, in <module>
result = process_orders(orders) # outer call - your code
File "orders.py", line 17, in process_orders
total = calculate_total(order) # middle call - your code
File "orders.py", line 31, in calculate_total
return sum(item['price'] for item in order['items']) # origin
KeyError: 'items' # error type + messageEn este ejemplo, el error es un `KeyError` para la clave `'items'`. El origen es la línea 31 de `orders.py`. El traceback te dice que `order` no tiene una clave `'items'` - o la estructura de datos es distinta de lo esperado, o la clave nunca se asignó. Ve a `orders.py:31`, comprueba qué contiene `order` en ese punto, y añade una guardia o corrige los datos aguas arriba.
Tipos comunes de excepciones de Python y su significado
- KeyError: Acceder a una clave de dict que no existe - usa `.get(key, default)` o comprueba con `key in d` primero.
- AttributeError: Llamar a un método o acceder a una propiedad que no existe en el objeto - comprueba el tipo del objeto.
- TypeError: Tipo incorrecto pasado a una función, u operar sobre tipos incompatibles (p. ej. `"text" + 5`).
- ValueError: Tipo correcto pero valor inválido - `int("abc")`, `math.sqrt(-1)`, o una función que rechaza un argumento fuera de rango.
- IndexError: Índice de lista o tupla fuera de rango - la lista es más corta de lo asumido.
- ImportError / ModuleNotFoundError: Un módulo no está instalado o la ruta de importación es incorrecta.
Tip
Explicador de tracebacks de Python
Pega cualquier traceback de Python y obtén un desglose estructurado del marco de origen, la cadena de llamadas y el arreglo probable - local en el navegador y completamente privado.
Flake8, Pylint y análisis estático
Las herramientas de análisis estático leen tu código fuente de Python sin ejecutarlo y aplican conjuntos de reglas que detectan problemas que un verificador de sintaxis no ve - nombres indefinidos, imports sin usar, funciones demasiado complejas y decenas de patrones asociados a bugs o mala mantenibilidad. Flake8 y Pylint son las dos opciones dominantes, y sirven a puntos diferentes del compromiso velocidad-vs-profundidad.
Flake8 - rápido, componible, fiscalizador de PEP 8
Flake8 combina tres herramientas: pyflakes (detecta nombres indefinidos, imports sin usar y variables redefinidas), pycodestyle (aplica las reglas de estilo PEP 8 - longitud de línea, espaciado alrededor de operadores, líneas en blanco entre funciones) y mccabe (marca funciones con complejidad ciclomática por encima de un umbral configurable). Se ejecuta rápido, produce salida compacta y tiene un rico ecosistema de plugins - los plugins añaden comprobaciones de seguridad (`flake8-bugbear`), exigencia de anotaciones de tipo (`flake8-annotations`) y reglas específicas de Django (`flake8-django`).
# Install Flake8
pip install flake8
# Check a single file
flake8 mymodule.py
# Check a directory
flake8 src/
# Ignore specific rules (E501 = line too long)
flake8 src/ --extend-ignore=E501
# Set maximum line length
flake8 src/ --max-line-length=100
# Count errors by code
flake8 src/ --statisticsPylint - análisis profundo y puntuación
Pylint realiza un análisis estático más profundo que Flake8. Construye un entendimiento completo de la estructura de tu módulo, rastrea los tipos de las variables entre asignaciones, comprueba que las firmas de métodos coincidan con sus llamadas y aplica un conjunto más amplio de convenciones. También produce una puntuación de calidad numérica de 0 a 10 que puedes seguir entre commits. La contrapartida es la velocidad - Pylint es significativamente más lento que Flake8 en codebases grandes - y la verbosidad: una primera ejecución de Pylint sobre un proyecto sin optimizar puede producir cientos de mensajes que necesitan triaje.
Empieza con Flake8 para el bucle rápido de retroalimentación en CI. Añade Pylint de forma selectiva para revisiones de código y auditorías pre-release. Ejecuta mypy continuamente si usas anotaciones de tipo. Tres herramientas, tres profundidades distintas.
Configurar Flake8 con setup.cfg
Flake8 lee su configuración de `setup.cfg`, `.flake8` o `tox.ini`. Una configuración mínima que fija la longitud de línea e ignora unas pocas reglas ruidosas mantiene la salida accionable sin suprimir advertencias importantes.
[flake8]
max-line-length = 100
extend-ignore = E203, W503
exclude =
.git,
__pycache__,
migrations/,
venv/
per-file-ignores =
tests/*: S101Note
Verificación de tipos con mypy
Mypy es un verificador de tipos estático que lee las anotaciones de tipo de Python - `def process(items: list[str]) -> int` - y verifica que cada función se llame con argumentos del tipo correcto y que los valores de retorno se usen apropiadamente. No ejecuta tu código; analiza la estructura e infiere tipos de las anotaciones que proporcionas. Los errores de tipo que mypy detecta no pueden convertirse en excepciones `TypeError` o `AttributeError` en producción.
Lo que mypy detecta y Flake8 pasa por alto
- Discrepancias de tipo: Pasar un `str` a una función que espera `int`, o devolver `None` de una función tipada como `-> str`.
- Seguridad de Optional: Llamar a un método sobre un valor tipado como `Optional[User]` sin comprobar primero si es `None`.
- Asignaciones incompatibles: Asignar un `list[int]` a una variable declarada como `list[str]`.
- Caminos de retorno faltantes: Una función con una rama que no devuelve nada cuando el tipo de retorno no es `None`.
- Discrepancias de sobrecarga: Llamar a una función con la combinación incorrecta de tipos de argumento para sus firmas sobrecargadas.
Primeros pasos con mypy
Mypy puede adoptarse de forma incremental - no necesitas anotar cada archivo antes de ver valor. Empieza ejecutando `mypy src/` con la opción `--ignore-missing-imports` para suprimir errores de librerías de terceros que carecen de stubs de tipos. Concéntrate primero en anotar funciones públicas, variables a nivel de módulo y tipos de retorno de funciones. El helper `reveal_type(expr)` (eliminado en tiempo de ejecución pero procesado por mypy) muestra el tipo inferido por mypy para cualquier expresión - útil cuando no estás seguro de por qué falla una comprobación.
# Install mypy
pip install mypy
# Basic check - report type errors in src/
mypy src/
# Ignore missing stubs for third-party libraries
mypy src/ --ignore-missing-imports
# Strict mode - enables all optional checks
mypy src/ --strict
# Check a single file
mypy orders.py
# Show error codes (useful for targeted suppression)
mypy src/ --show-error-codesTip
Verificación de errores en CI/CD
La verificación manual de errores durante el desarrollo es buena práctica pero no una garantía. Automatizar la comprobación de errores de Python en tu pipeline de CI/CD asegura que ningún error de sintaxis, violación de Flake8 o error de tipo pueda fusionarse en la rama principal - sin importar si un desarrollador ejecutó las comprobaciones localmente.
Una compuerta de calidad de Python mínima
name: Python Quality
on:
pull_request:
paths: ['src/**/*.py', 'tests/**/*.py']
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
- run: pip install flake8 mypy
- name: Syntax check
run: python -m compileall src/
- name: Flake8
run: flake8 src/ --max-line-length=100 --statistics
- name: mypy
run: mypy src/ --ignore-missing-importsEl paso `compileall` detecta cualquier error de sintaxis que impida la importación; Flake8 detecta nombres indefinidos, imports sin usar y violaciones de estilo; mypy detecta errores de tipo. Los tres pasos salen con código distinto de cero en caso de fallo, lo que bloquea la fusión del pull request. Ejecutar las comprobaciones en `pull_request` en lugar de en `push` a `main` significa que la retroalimentación llega mientras el autor aún puede actuar sobre ella, no después de la fusión.
Hooks de pre-commit para aplicación local
Los hooks de pre-commit ejecutan las mismas comprobaciones localmente antes de crear un commit. El framework `pre-commit` gestiona esto para proyectos de Python - añade un `.pre-commit-config.yaml` que referencie los hooks oficiales de Flake8 y mypy, y cada colaborador obtiene las mismas comprobaciones aplicadas automáticamente en el commit sin configuración manual.
| Herramienta | Qué detecta | Velocidad | Privacidad | Configuración requerida |
|---|---|---|---|---|
| Validador de sintaxis de Python (Aback Tools) | Errores de sintaxis + indentación | Instantánea | ✓ 100% local | Ninguna - basado en navegador |
| python -m py_compile | Errores de sintaxis | Rápida | ✓ Local | Python instalado |
| Flake8 | Sintaxis + nombres indefinidos + PEP 8 | Rápida | ✓ Local | pip install flake8 |
| Pylint | Análisis profundo + puntuación | Lenta | ✓ Local | pip install pylint |
| mypy | Errores de tipo | Media | ✓ Local | pip install mypy + anotaciones |
| Explicador de tracebacks de Python | Análisis de excepciones en ejecución | Instantánea | ✓ 100% local | Ninguna - basado en navegador |
Warning
Buenas prácticas de depuración
Los buenos hábitos de verificación de errores reducen significativamente el tiempo dedicado a depurar. Estas prácticas funcionan en scripts, aplicaciones Django, pipelines de datos y cualquier otro contexto de Python - las herramientas cambian pero los principios permanecen.
Arregla el primer error, no todos los errores
Los errores de sintaxis de Python se cascan en cascada - un par de puntos faltante en la línea 10 puede producir tres errores reportados separados a medida que el parser pierde contexto. Arregla siempre primero el error reportado más alto y vuelve a ejecutar el verificador. Lo que parecían cinco bugs suele ser uno. Lo mismo aplica a la salida de mypy: una sola función sin anotar puede generar una cascada de errores de tipo posteriores, todos los cuales desaparecen cuando se añade la única anotación raíz.
Usa anotaciones de tipo desde el principio
Anotar las firmas de funciones mientras las escribes cuesta un tiempo insignificante y rinde de inmediato: el autocompletado de tu editor se vuelve preciso, mypy detecta usos incorrectos en el sitio de llamada y la documentación se construye dentro del código. Empieza con las firmas de funciones públicas - parámetros y tipos de retorno - antes de pasar a variables internas. El import `from __future__ import annotations` habilita la sintaxis de evaluación diferida que hace que las anotaciones sean compatibles hacia adelante con versiones anteriores de Python.
Valida los datos externos en el límite
La mayoría de las excepciones `KeyError`, `TypeError` y `AttributeError` en producción provienen de datos externos - respuestas de API, resultados de consultas a la base de datos, entrada de usuario o archivos de configuración - que no coinciden con la forma esperada. Usa modelos de Pydantic o dataclasses para validar los datos entrantes en el límite, no en lo profundo de la lógica de negocio. Para comprobar patrones regex usados para parsear texto externo, el probador de regex de Python valida tus patrones del módulo `re` en vivo contra entrada de muestra, previniendo excepciones de ejecución relacionadas con regex antes de que lleguen a producción.
- Arregla primero el primer error: Los errores de sintaxis se cascan - un problema real produce varios reportados.
- Habilita Flake8 en tu editor: La retroalimentación en tiempo real detecta errores mientras escribes, no después del commit.
- Añade mypy progresivamente: Anota primero las APIs públicas; usa `--allow-untyped-defs` durante la migración.
- Valida los datos externos: Las respuestas de API y los archivos de configuración deben comprobarse en el límite, no asumirse correctos.
- Escribe pruebas para las rutas críticas: Las pruebas unitarias sacan a la luz errores de lógica que ninguna herramienta estática detecta.
- Usa el explicador de tracebacks para errores desconocidos: Pega cualquier traceback de Python para obtener un desglose estructurado instantáneo.
Tip
Key takeaways
- Los errores de sintaxis se detectan antes de la ejecución - usa el validador de sintaxis de Python para verificación instantánea local en el navegador, o `python -m py_compile` para verificación por CLI sin instalación extra.
- Los tracebacks muestran la cadena completa de llamadas hasta el error - léelos de abajo hacia arriba, identifica el primer marco en tu propio código y usa el explicador de tracebacks de Python para un desglose estructurado.
- Flake8 combina verificación de sintaxis, detección de nombres indefinidos y aplicación de PEP 8 en una herramienta rápida - la opción práctica por defecto para la mayoría de proyectos de Python.
- Pylint realiza un análisis más profundo y produce una puntuación de calidad, lo que lo hace más valioso para revisiones de código y auditorías pre-release que para comprobación en cada commit.
- Mypy detecta errores de tipo antes de que se conviertan en excepciones de ejecución - adóptalo progresivamente empezando por las firmas de funciones públicas.
- Añade `python -m compileall`, Flake8 y mypy a tu pipeline de CI/CD para que ningún error de sintaxis o tipo pueda fusionarse sin ser detectado.
- Nunca subas código propietario de Python a linters online del lado del servidor - el validador de sintaxis de Python y el explicador de tracebacks de Aback Tools procesan todo completamente en tu navegador.