Sistema de préstamos con identificación de usuarios en Python
Clase 11 de 17 • Curso 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 comparausuario.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.