Reglas Esenciales de Linting
No todas las reglas de linting justifican su tiempo en CI. Estos conjuntos de reglas detectan errores reales y desviaciones de estilo con un mínimo de falsos positivos para proyectos de Python 3.14.
Receta
[tool.ruff.lint]
select = ["E", "F", "I", "UP", "B", "SIM", "RUF", "S", "T20"]
ignore = ["E501", "S101"] # longitud de línea a través del formateador; assert ok en testsCuándo usar esto:
- Al iniciar la configuración de linting para un nuevo proyecto
- Al actualizar de un flake8 mínimo a un conjunto completo
- Al mejorar la CI sin abrumar al equipo
Ejemplo de Trabajo
# Violaciones detectadas por reglas esenciales:
import os, sys # I: imports desordenados
x = 1 # F841: variable no utilizada (F)
eval("1+1") # S307: eval peligrosa (S)
print("debug") # T20: sentencia print (T20)
class unused: ... # F: definida pero nunca usadauv run ruff check example.py
# I001 Bloque de importación no ordenado
# F841 La variable local `x` se asigna pero nunca se usa
# S307 Uso de función posiblemente insegura
# T201 Se encontró `print`Lo que esto demuestra:
Idetecta el desorden de importaciones antes de la revisiónFdetecta código muerto y nombres no definidosS(bandit) marca anti-patrones de seguridadT20detecta impresiones de depuración sobrantes
Análisis Profundo
Niveles Recomendados
| Nivel | Reglas | Propósito |
|---|---|---|
| Núcleo | E, F, I, UP | Estilo, errores, importaciones, actualizaciones de sintaxis |
| Calidad | B, SIM, RUF | Bugbear, simplificación, específico de ruff |
| Seguridad | S (bandit) | Inyección SQL, eval, secretos codificados |
| Higiene | T20, PT | No imprimir en producción; mejores prácticas de pytest |
Anulaciones por Directorio
[tool.ruff.lint.per-file-ignores]
"tests/**" = ["S101"] # permitir assert en tests
"migrations/**" = ["E", "F"] # omitir lint en migraciones de DjangoTrampas Comunes
- Habilitar todo (
select = ["ALL"]) - cientos de falsos positivos. Solución: empezar con el conjunto principal; añadir reglas incrementalmente. - S101 en archivos de prueba - bandit marca
assert. Solución: ignorar por archivo paratests/**. - Reglas UP en Python no soportado - pyupgrade sugiere sintaxis que no puedes ejecutar. Solución: hacer coincidir
target-versionconrequires-python. - T20 en scripts CLI - print es correcto para la salida CLI. Solución: ignorar T20 en
scripts/o puntos de entrada CLI. - Ignorar demasiadas reglas - el linting pierde su significado. Solución: cada ignoración necesita un comentario que explique por qué.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Mínimo (solo E, F) | Prototipo muy temprano | Código de producción |
| ALL Completo | Sistemas críticos para la seguridad | Equipos pequeños sin presupuesto de linting |
| pylint | Análisis profundo | CI crítica en velocidad |
Preguntas Frecuentes
¿Qué reglas debería habilitar todo proyecto?
Como mínimo: E, F, I, UP. Añadir B y SIM para calidad, S para código sensible a la seguridad.
¿Cómo encuentro lo que hace una regla?
ruff rule B006 imprime la descripción de la regla y ejemplos.
¿Debería habilitar las reglas de verificación de tipos?
Ruff tiene reglas de flake8-type-checking (TCH). Útiles pero pueden ser ruidosas. Prefiere mypy/pyright para tipos.
¿Cómo adopto reglas incrementalmente?
Habilita nuevas reglas, ejecuta ruff check --fix, confirma las correcciones, luego añádelo a CI.
¿Qué es RUF?
Reglas nativas de Ruff para patrones que otros plugins pasan por alto (Unicode ambiguo, pyproject.toml inválido).
¿Deberían las pruebas tener reglas diferentes?
Sí. Permite assert (S101), print para depuración, y valores mágicos (PLR2004) en las pruebas.
¿Cómo suprimo una regla en todo el proyecto?
Añádela a ignore = ["RULE"] en [tool.ruff.lint].
¿Son lentas las reglas de seguridad (S)?
No en ruff. Son rápidas y de alto valor para aplicaciones web y CLIs que manejan entrada del usuario.
¿Qué pasa con las reglas específicas de Django?
Habilita DJ (flake8-django) para proyectos de Django. Omite para FastAPI/Flask.
¿Con qué frecuencia debo actualizar los conjuntos de reglas?
Al actualizar ruff. Revisa el changelog para nuevas reglas de alto valor cada trimestre.
Relacionado
- Configuración de Ruff - instalación y configuración
- isort y Organización de Importaciones - detalle de reglas de importación
- mypy y pyright en CI - capa de verificación de tipos
- Mejores Prácticas de Linting y Formateo - estrategia de adopción
Versiones de la Pila: Esta página fue escrita para Python 3.14.0, 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+.