Estándares de Desarrollo
📝 Estilo de Código
Python
Seguimos PEP 8 con algunas modificaciones:
# Correcto
def get_ubicacion_by_id(ubicacion_id: UUID) -> Optional[Ubicacion]:
return db.query(Ubicacion).filter(Ubicacion.id == ubicacion_id).first()
# Incorrecto
def getUbicacionById(ubicacionId):
return db.query(Ubicacion).filter(Ubicacion.id==ubicacionId).first()
Convenciones de Nombrado
- Variables y funciones: snake_case
- Clases: PascalCase
- Constantes: MAYÚSCULAS_CON_GUIONES
- Módulos: minúsculas_con_guiones
- Tipos: PascalCase
🏗️ Arquitectura
Estructura de Carpetas
app/
├── main.py # Punto de entrada
├── database.py # Configuración DB
├── models.py # Modelos SQLAlchemy
├── schemas.py # Schemas Pydantic
├── enums.py # Enumeraciones
└── routes/ # Endpoints API
└── places.py # Rutas de ubicaciones
Patrones de Diseño
-
Dependency Injection
-
Repository Pattern
🧪 Testing
Estructura de Tests
tests/
├── conftest.py # Fixtures compartidos
├── test_api.py # Tests de API
└── test_models.py # Tests de modelos
Ejemplo de Test
def test_get_ubicaciones(client, db):
response = client.get("/ubicaciones/")
assert response.status_code == 200
assert len(response.json()) > 0
📚 Documentación
Docstrings
Usamos el formato Google para docstrings:
def get_ubicacion_by_type(type: str) -> List[Ubicacion]:
"""Obtiene ubicaciones filtradas por tipo.
Args:
type (str): Tipo de ubicación (PRONTO, BENCINERA, etc)
Returns:
List[Ubicacion]: Lista de ubicaciones del tipo especificado
Raises:
ValueError: Si el tipo no es válido
"""
Comentarios
- Usar comentarios para explicar "por qué", no "qué"
- Mantener comentarios actualizados
- Escribir en español por consistencia
🔒 Seguridad
Validación de Datos
from pydantic import BaseModel, validator
class UbicacionCreate(BaseModel):
name: str
latitude: float
longitude: float
@validator('latitude')
def validate_latitude(cls, v):
if not -90 <= v <= 90:
raise ValueError('Latitud inválida')
return v
Manejo de Errores
from fastapi import HTTPException
def get_ubicacion(id: UUID):
ubicacion = db.get(id)
if not ubicacion:
raise HTTPException(
status_code=404,
detail="Ubicación no encontrada"
)
return ubicacion
🚀 Performance
- Usar índices en la base de datos
- Implementar caché cuando sea necesario
- Paginar resultados grandes
- Optimizar consultas N+1