Sistema de préstamos con identificación de usuarios en Python

Clase 11 de 17Curso de Python Orientado a Objetos

Resumen

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.py class UsuarioNoEncontrado(Exception): pass # biblioteca.py from exceptions import UsuarioNoEncontrado class Biblioteca: def __init__(self): self.usuarios = [] self.libros = [] def buscar_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.py from 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.