Tiempo total: 40 minutos
Esta prueba evalúa cuatro áreas clave de un desarrollador Python senior. Cada ejercicio tiene un tiempo sugerido; adminístralo según tu criterio.
| # | Tema | Archivo principal | Tiempo |
|---|---|---|---|
| 1 | Estructuras de datos — LRU Cache en contexto real | ejercicio1/ |
15 min |
| 2 | Python idiomático — Decorador @retry |
ejercicio2/ |
12 min |
| 3 | OOP y diseño — Jerarquía de figuras geométricas | ejercicio3/ |
8 min |
| 4 | Git — Escenarios y preguntas conceptuales | ejercicio4/ |
5 min |
- Python 3.10 o superior
- pytest
pip install pytest# Todos los ejercicios de una vez
pytest ejercicio1/ ejercicio2/ ejercicio3/ -v
# Un ejercicio individual
pytest ejercicio1/ -v
pytest ejercicio2/ -v
pytest ejercicio3/ -vAl comenzar, todos los tests fallarán porque los archivos de implementación están vacíos. El objetivo es que todos pasen al terminar.
- No modificar los archivos
test_*.pyni losconftest.py. - Implementar únicamente en los archivos indicados en cada ejercicio.
- No usar las librerías o funciones explícitamente prohibidas en cada ejercicio.
- Se permite usar la librería estándar de Python salvo las excepciones indicadas.
- No se permiten librerías externas (salvo
pytestpara correr los tests). - Todo el código debe estar escrito en inglés: nombres de variables, funciones, clases, comentarios y docstrings.
Archivos a modificar: ejercicio1/lru_cache.py y ejercicio1/product_service.py
Un servicio de catálogo consulta datos de productos desde una base de datos costosa. Para evitar consultas redundantes, el servicio debe usar un caché LRU.
Tu tarea:
- Implementar la clase
LRUCacheenlru_cache.py. - Completar
ProductService.__init__yProductService.get_productenproduct_service.py.
Restricciones obligatorias:
- ❌ No usar
collections.OrderedDict - ❌ No usar
functools.lru_cacheni@cache - ✅
get()yput()deben ser O(1) en tiempo promedio
Criterios de evaluación:
- Correctitud de la lógica de evicción LRU
- Complejidad temporal O(1)
- Integración correcta con
ProductService
Archivo a modificar: ejercicio2/retry.py
Implementar un decorador de fábrica que reintente automáticamente una función cuando lanza ciertos tipos de excepción.
@retry(times=3, exceptions=(ValueError, ConnectionError))
def consultar_api():
...Requisitos:
times: número máximo de intentos (incluye el primero).exceptions: solo reintentar para los tipos listados; otros se propagan de inmediato.- Usar
functools.wrapspara preservar__name__y__doc__. - Si se agotan los intentos, relanzar la última excepción.
Criterios de evaluación:
- Lógica correcta de reintentos y conteo
- Manejo selectivo de excepciones
- Preservación de metadatos de la función
Archivo a modificar: ejercicio3/shapes.py
Implementar una jerarquía de figuras geométricas usando clases abstractas.
Clases a implementar:
Shape(ABC): base conarea(),perimeter(),__eq__(por área),__lt__(por área),__repr__.Circle(Shape): definido porradius. LanzarValueErrorsiradius <= 0.Rectangle(Shape): definido porwidthyheight. LanzarValueErrorsi alguno<= 0.
Criterios de evaluación:
- Uso correcto de
ABCy@abstractmethod - Implementación de
__eq__y__lt__(que habilitansorted()y comparaciones) - Validación de parámetros con
ValueError - Fórmulas correctas para área y perímetro
Archivo a completar: ejercicio4/respuestas.md
Lee los escenarios en ejercicio4/preguntas.md y escribe tus respuestas en ejercicio4/respuestas.md.
Criterios de evaluación:
- Comandos exactos y correctos para cada escenario
- Comprensión de merge vs rebase y sus casos de uso
- Conocimiento de cómo operar de forma segura sobre historia compartida
| Criterio | Descripción |
|---|---|
| Correctitud | Los tests pasan; la lógica es correcta |
| Conocimiento de Python | Uso idiomático, tipos de datos adecuados |
| Diseño | Responsabilidades claras, código legible |
| Git | Comandos precisos, comprensión de flujos |