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.