1) Arquitectura objetivo del proyecto final
Diseña el flujo antes de codificar: ETL + validación + observabilidad.
En este proyecto vas a simular un flujo de inventario: recibes registros en texto, los normalizas y generas un resumen para operaciones.
Separar `extract()`, `transform()` y `load()` evita acoplamiento y facilita testear cada parte de manera aislada.
El manejo de errores debe capturar filas inválidas sin tumbar todo el proceso, pero reportando cuántas se descartaron y por qué.
from typing import Iterable
def extract() -> Iterable[str]:
return [
'sku=A1,qty=10,price=9.5',
'sku=B9,qty=2,price=31',
'sku=C3,qty=bad,price=8.2',
]
def transform(rows: Iterable[str]) -> list[dict]:
raise NotImplementedError
def load(records: list[dict]) -> dict:
raise NotImplementedError