Consolida lo aprendido para construir un sistema de préstamos en Python claro y robusto. Aquí se integran identificación de usuarios por cédula, verificación de disponibilidad de libros, validación del límite de préstamos y registro del préstamo, con mensajes de confirmación o error precisos. Además, se retoma el reto previo: crear una excepción específica de libro no disponible y otras que apoyan el flujo de la aplicación.
¿Cómo se estructura el sistema de préstamos con Python y excepciones?
El proyecto organiza una clase Biblioteca con dos colecciones: una lista de usuarios y una lista de libros. Se reutiliza la lista declarada en main asignándola a biblioteca.usuarios y lo mismo con los libros usando biblioteca.libros. Se limpian ejemplos que ya no se usan y se eliminan flags redundantes como disponible = True en clases que ya lo heredan, facilitando la lectura del código.
Flujo de requerimientos del sistema:
Identificar al usuario por cédula.
Solicitar el libro deseado.
Verificar disponibilidad del libro.
Validar límite de préstamos permitido.
Registrar el préstamo.
Mostrar confirmación o error adecuado.
Excepción revisada del reto anterior:
Libro no disponible: error específico dentro de exceptions para claridad al prestar.
¿Qué pasos de código habilitan búsqueda, entrada y manejo de errores?
El primer paso clave es crear un método para localizar usuarios por cédula y responder con una excepción clara si no existe.
¿Cómo buscar un usuario por cédula con manejo de error?
Método en la clase biblioteca: buscar_usuario(cedula) recorre con for la lista self.usuarios y compara usuario.cedula.
Si lo encuentra, retorna el objeto usuario.
Si no, hace raise de UsuarioNoEncontrado con un mensaje útil: “El usuario con la cédula X no fue encontrado.”
# exceptions.pyclassUsuarioNoEncontrado(Exception):pass# biblioteca.pyfrom exceptions import UsuarioNoEncontrado
classBiblioteca:def__init__(self): self.usuarios =[] self.libros =[]defbuscar_usuario(self, cedula:str):for usuario in self.usuarios:if usuario.cedula == cedula:return usuario
raise UsuarioNoEncontrado(f"El usuario con la cédula {cedula} no fue encontrado.")
Claves técnicas mencionadas: for, raise, excepción UsuarioNoEncontrado, retorno del usuario válido.
¿Cómo capturar la cédula y validar con try-except?
Se pide la cédula con input cuidando el formato del prompt: "Digite el número de cédula: ".
Se usa try-except (mencionado como “try catch”) para capturar UsuarioNoEncontrado y evitar que el programa termine abruptamente.
Se imprime el usuario solo si fue encontrado, moviendo el print al lugar correcto para no mostrar datos inexistentes.
# main.pyfrom exceptions import UsuarioNoEncontrado
from biblioteca import Biblioteca
biblioteca = Biblioteca()# Asignar datos iniciales creados previamente# biblioteca.usuarios = [...]# biblioteca.libros = [...]print("Bienvenido a Platzi Biblioteca.")print("Libros disponibles:")for titulo in biblioteca.libros_disponibles():print(f" - {titulo}")print()cedula =input("Digite el número de cédula: ")try: usuario = biblioteca.buscar_usuario(cedula)print(f"Cédula: {usuario.cedula}, Nombre: {usuario.nombre}")except UsuarioNoEncontrado:print("El usuario que estás buscando no existe.")
Palabras clave aplicadas: input, print, try-except, UsuarioNoEncontrado, formato de prompt claro y validación de usuario.
¿Cómo mejorar la experiencia mostrando libros disponibles?
Se agrega un título: “Libros disponibles”.
Se invoca el método biblioteca.libros_disponibles() que retorna títulos y se imprime con un guion y sangría para legibilidad.
Se eliminan libros marcados como no disponibles cuando ya no aportan al ejemplo.
Consejo práctico:
Mantener el listado de libros e usuarios centralizado en biblioteca.libros y biblioteca.usuarios evita duplicidades y confusiones.
¿Qué habilidades y conceptos clave refuerzas al implementarlo?
Este desarrollo potencia buenas prácticas de organización de código y control de errores, esenciales en aplicaciones de gestión.
Manejo de excepciones personalizadas: UsuarioNoEncontrado y libro no disponible para mensajes claros.
Búsqueda lineal en colecciones: comparación usuario.cedula == cedula con for.
Interacción con usuario: uso de input y print con formatos legibles.
Modularidad: separación en módulos main, biblioteca y exceptions.
Legibilidad: eliminar flags redundantes (como disponible = True cuando ya se hereda) y ejemplos obsoletos.
UX básica en terminal: listado de libros disponibles antes de solicitar cédula.
Preparación para el siguiente paso: crear un módulo de libros de ejemplo para pruebas de búsqueda y préstamo.
Como reto final, crea un módulo nuevo que genere datos de libros de ejemplo y así podrás buscarlos y pedirlos prestados en el siguiente paso.
¿Tienes dudas o una variante de implementación? Comparte en comentarios cómo organizaste tus módulos, nombres de excepciones y mejoras al flujo de préstamo.