50 Reglas de Python que Todo Especialista Debería Seguir
Una lista de verificación maestra de hábitos que separan el Python de producción del código de tutorial. Agrupadas por dominio; cada regla es accionable y aplicable con herramientas donde se indica.
Receta
Escanee esta lista trimestralmente. Habilite las reglas de ruff/mypy que automaticen cada elemento "aplicable".
Cuándo recurrir a esto:
- Incorporación de desarrolladores Python senior
- Revisiones de arquitectura y bases para auditorías de código
- Configuración de políticas de linting y CI para el equipo
Referencia de Reglas de Python
| # | Regla | Categoría |
|---|---|---|
| 1-10 | Estilo y legibilidad | Formato |
| 11-20 | Tipos y contratos | Seguridad |
| 21-30 | Estructura y módulos | Diseño |
| 31-40 | Errores y pruebas | Fiabilidad |
| 41-50 | Seguridad y operaciones | Producción |
Análisis Profundo
Estilo y Legibilidad (1-10)
- Siga PEP 8 - Líneas de 88 caracteres con
ruff format; sin debates manuales de estilo. - Use nombres descriptivos -
total_factura, noxotmp. - Prefiera f-strings -
f"{nombre}"en lugar de"{}".format()y formato%. - Orden de importación: stdlib, terceros, propios - deje que
ruff isortlo aplique. - Una declaración por línea - sin cadenas de punto y coma ni
if foo: bar()compuestos. - Lo explícito es mejor que lo implícito - sin números mágicos; use constantes con nombre.
- Lo plano es mejor que lo anidado - retornos tempranos en lugar de indentación de 5 niveles.
- Use
pathlib.Path- noos.path.joinpara código nuevo. - Use
enum.Enum- para conjuntos fijos de constantes, no literales de cadena. - Docstrings en APIs públicas - estilo Google o NumPy; mínimo de una línea.
Tipos y Contratos (11-20)
- Tipifique todas las funciones públicas - parámetros y tipos de retorno.
- Ejecute mypy o pyright en CI - los tipos son contratos, no sugerencias.
- Use
X | None, noOptional[X]- sintaxis de unión de Python 3.14. - Prefiera
list[str]sobreList[str]- genéricos incorporados (PEP 585). - Use
TypedDicto Pydantic - para diccionarios estructurados, nodictsin más. - Estreche tipos con
isinstance- no comprobacionestype()sin más. - Use
Protocolpara duck typing - subtipado estructural sobre ABCs cuando sea apropiado. - Marque
anyintencional con comentarios -# type: ignorenecesita una razón. - Dataclasses para contenedores de datos -
frozen=Truecuando sea inmutable. - Pydantic 2 para límites de validación - entrada HTTP, configuración, datos externos.
Estructura y Módulos (21-30)
- Diseño
src/- paquete instalable y testeable como lo ven los consumidores. - Una responsabilidad por módulo - archivos de menos de 300 líneas; dividir cuando sean más grandes.
- Sin importaciones circulares - reestructure o use importaciones perezosas
TYPE_CHECKING. - Importaciones absolutas -
from myapp.services import billing, no cadenas de puntos relativas en bibliotecas. __all__explícito - para la superficie de API pública del paquete.- Sin lógica en
__init__.py- solo reexportaciones; manténgalo delgado. - Inyección de dependencias sobre globales - pase dependencias como parámetros o fixtures.
- Configuración a través de entorno + pydantic-settings - no secretos o rutas codificadas.
- Separe el dominio de la E/S - funciones puras testeables sin mocks.
- Use
pyproject.toml- configuración única para dependencias, herramientas y compilación.
Errores y Pruebas (31-40)
- Excepciones específicas -
raise ValueError("pct debe ser 0-100"), noraise Exceptionsin más. - Nunca oculte excepciones -
except: passes casi siempre incorrecto. - Use encadenamiento de excepciones -
raise NewError(...) from original. - Gestores de contexto para recursos -
with open(...)y@contextmanager. - pytest para todas las pruebas - sin código repetitivo de unittest para código nuevo.
- Un comportamiento por prueba - nombres descriptivos:
test_discount_over_100_raises. - Mock en los límites - HTTP, DB, sistema de archivos; no lógica interna.
- Suelo de cobertura del 80% - cobertura de ramas en módulos críticos.
- Sin
printen bibliotecas - useloggingcon un logger a nivel de módulo. - Logging estructurado en producción - logs JSON con IDs de correlación.
Seguridad y Operaciones (41-50)
- Nunca confirme secretos - variables de entorno, gestores de secretos,
.envgitignoreado. - Fije las dependencias - lockfile confirmado;
uv sync --frozenen CI. - Valide toda la entrada externa - Pydantic en los límites de la API.
- Use el módulo
secrets- norandompara tokens y contraseñas. - SQL parametrizado - nunca haga f-string a consultas SQL.
- Mantenga Python actualizado - parches de seguridad dentro de los 30 días posteriores al lanzamiento.
- Ejecute
pip-auditen CI - escaneo semanal de vulnerabilidades de dependencias. - Mínimo privilegio - permisos mínimos de IAM, DB y acceso a archivos.
- Apagado elegante - maneje SIGTERM; vacíe logs y cierre conexiones.
- Mida antes de optimizar - perfile primero; legibilidad por defecto sobre velocidad.
Trampas Comunes
- Tratar las reglas como dogma - el contexto importa; documente excepciones en ADRs. Solución: las reglas guían los valores predeterminados, no los absolutos.
- Habilitar todas las reglas de ruff desde el primer día - fatiga de alertas. Solución: adopte incrementalmente por grupo arriba.
- Tipos sin pruebas - mypy en verde pero comportamiento incorrecto. Solución: combine tipos con cobertura de pytest.
- 50 reglas, cero automatización - las reglas decaen sin CI. Solución: mapee reglas a puertas de ruff/mypy/pre-commit.
- Aplicar reglas de biblioteca a scripts - los scripts únicos pueden relajar las reglas de estructura. Solución: escale las reglas por tipo de paquete.
Alternativas
| Alternativa | Úselo Cuando | No lo Use Cuando |
|---|---|---|
| Documento de guía de estilo del equipo | Convenciones personalizadas más allá de PEP 8 | Reglas ya cubiertas aquí |
| Solo códigos de reglas de Ruff | Equipo enfocado en la automatización | La incorporación necesita justificación |
| Linter sin lista | Equipo pequeño y experimentado | El equipo en crecimiento necesita una base compartida |
Preguntas Frecuentes
¿Cómo hago cumplir estas reglas?
Mapee a reglas select de ruff, strict de mypy, hooks de pre-commit y comprobaciones requeridas de CI.
¿Qué reglas importan más?
Tipos (11-20), pruebas (31-40) y seguridad (41-50) previenen incidentes de producción.
¿Los scripts siguen las 50?
Los scripts relajan las 21-30 (estructura) pero mantienen la seguridad (41-50) y el estilo (1-10).
¿Con qué frecuencia revisar?
Revisión trimestral del equipo. Actualice cuando Python o las herramientas lancen versiones importantes.
¿Conflicto entre reglas?
La seguridad y la corrección priman sobre el estilo. Documente los compromisos en la descripción de la PR.
¿Aplicación para juniors vs seniors?
Juniors: enfóquese primero en 1-20. Seniors: aplique 41-50 en revisiones y arquitectura.
¿Cómo se relacionan estas con PEP 8?
Las reglas 1-10 amplían PEP 8 con herramientas modernas (ruff, pathlib, f-strings).
¿Son específicas de FastAPI?
No. Universales de Python. Consulte las 40 reglas de API para obtener orientación específica para web.
¿Puedo generar esta lista de verificación automáticamente?
Úsela como documento de política de CI. ruff.toml y mypy.ini son el formato legible por máquina.
¿Qué pasa con el código async?
Consulte 30 Reglas Async para reglas específicas de asyncio.
Relacionados
- Referencia de PEP 8 y Estilo - detalles de estilo
- 30 Reglas de Seguridad para Python - análisis profundo de seguridad
- Decisiones de Arquitectura Python - decisiones estructurales
- Mejores Prácticas de Linting y Formateo - aplicación de herramientas
Versiones de Stack: 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+.