Implementar el comando delete para borrar un cliente es directo cuando se prioriza reutilizar código y factorizar funciones. Aquí se muestra cómo integrar delete al flujo CRUD sin duplicar lógica, con buenas prácticas que facilitan el mantenimiento y un ciclo de feedback claro desde la consola.
¿Qué es el patrón CRUD y por qué importa?
El flujo que se ejecuta es consistente: crear, mostrar, actualizar y borrar clientes. Este patrón, conocido como CRUD, aparece en muchas soluciones: API de aplicaciones web, programas de escritorio como correo y bloc de notas, y cualquier sistema que gestione elementos persistentes.
CRUD es un estándar práctico en ingeniería de software.
Permite estructurar los comandos y el ciclo de trabajo.
Facilita extender el sistema conforme crecen los componentes.
Además, se adelanta que más adelante se incorporará persistencia: guardar la lista en disco para conservar datos entre sesiones del programa.
¿Cómo implementar delete sin repetir código?
La implementación de delete se alinea con update, pero con una diferencia clave: solo requiere el nombre del cliente. Se reutiliza la función existente para obtener la entrada del usuario y se encapsula el borrado en una función específica.
Reutiliza la función para pedir el nombre del cliente.
Trabaja con la referencia global a clients.
Valida si el cliente existe antes de borrar.
Da feedback cuando el cliente no está en la lista.
# Ejemplo del borrado de un clientedefdelete_client(client_name):global clients
if client_name in clients:# se selecciona el nombre incluyendo la coma y se sustituye por un string vacío clients = clients.replace(client_name +',','')else:print('client is not in clients list')# flujo típiconame = get_client_name()# función ya existente y reutilizabledelete_client(name)list_clients()# para observar el cambio en la salida
¿Cómo reutilizar get client name para pedir entrada?
La ventaja de factorizar funciones es clara: si se necesita modificar cómo se solicita el nombre, se cambia en un solo lugar y el ajuste impacta en todo el programa. Evitar el copy paste previene que el código se vuelva inmanejable conforme crece.
¿Cómo validar y borrar en la lista global clients?
Se usa la referencia global a clients y se verifica si el nombre existe. Si está, se selecciona el nombre con su coma y se reemplaza por un string vacío: eso borra al cliente de la estructura actual.
¿Cómo dar feedback con list clients?
Mostrar el estado con list clients es útil para entender qué pasa internamente. Al borrar, se ve al instante el efecto del comando y se detectan posibles errores.
¿Qué habilidades y buenas prácticas se refuerzan?
Este ejercicio consolida competencias clave para construir software mantenible y claro.
Factorización de funciones: centraliza lógica repetida.
Reutilización de código: acelera cambios futuros.
Validaciones explícitas: mensajes como "client is not in clients list" ayudan a depurar.
Gestión de estado global: uso de variables globales con cuidado.
Ciclo CRUD completo: crear, listar, actualizar y borrar.
Evolución del diseño: preparación para añadir clases, decoradores y funciones de alto nivel.
Persistencia futura: promesa de guardar en disco para múltiples sesiones.
Si algo no quedó claro o quieres proponer una mejor forma de factorizar mensajes y validaciones, comparte tu duda o mejora en los comentarios: la comunidad puede ayudarte a avanzar más rápido.
Es un modelo muy utilizado por científicos de computadores. Se usa mucho en aplicaciones web, para construir modelos usables.
Mejor detallado!
Claro, se usa básicamente en las tablas mantenimiento !
def _client_not_found():returnprint('Client is not in clients list')
cool, gracias por el aporte
porque el metodo se declara como privado?
Un crud es algo básico, sin embargo por experiencia he visto que muchos desarrolladores no pasan esta prueba técnica (Hacer un crud a partir de un CSV), pero eso si se llenan la boca auto nombrandose Senior 😕
¿Será que solo reutilizan código o que ya utilizan librearías que lo hacen y no lo practican?
.
¿O simplemente demuestra que no saben generar una lógica de programación?
Y con cuánta frecuencia los ves?
Código actualizado y comentadocon las sugerencias de los demás compañeros.
Espero les sirva 😎👍
#proyecto_final
clients ='Rogelio, Paco, Sebastian, Adrian' #creamos el string con los nombres de los clientes
def _print_welcome(): #funcion para dar el mensaje de bienvenida
print('Welcome to Monares POS')print('what would you like to do today?')print('*'*52) #imprimimos el caracter "*"52 veces
#Mostramos el menu al usuario
print('[C]reate client')print('[R]ead client\'s list ')print('[U]pdate client')print('[D]elete client')def verify_client(client_name):"""
Esta funcion sirve para verificar si un cliente se encuentra en el string o no.Recibe un parametro, el nombre del cliente y devuelve un valor positivo si el nombre
se encuentra en el string y viceversa
"""
global clients
if client_name inclients:returnTrueelse:returnFalsedef _client_not_found_tollgate():"""
Esta funcion sirve para mostrar un mensaje preestablecido si un cliente no se encuentra
en el string de los clientes
"""
print("Client is not in client\'s list")def create_client(client_name):"""
Esta función sirve para agregar un cliente al string de la lista
"""
global clients #Utilizamos global para definir que la variable es la global, es decir la que definimos con pablo y ricardo
if(verify_client(client_name)): #Ejecutamos la funcion verify client, si la cadena del nombre del cliente está en el string etonces...print('Client already exists') #Mostramos un mensaje al usuario
else:_add_coma() #Si no, ejecutamos la funcion _add_coma para agregar una coma y un espacio al último nombre
clients += client_name #adicionamos el nuevo string pero con la funcion capitalize para poner el primer caractér en mayuscula y seguir con el formato
def read_client_list():"""
función que imprime la lista de clientes
"""
global clients
print(clients) #imprimimos el string clientes, es decir la lista de clientes
def update_client(client_name):"""
Función que sirve para actualizar el nombre de un cliente, recibe un parametro que es el string del nombre del cliente a editar
"""
global clients #Utilizamos global para definir que la variable es la globarl, es decir la que definimos con pablo y ricardo
if(verify_client(client_name)): #Si el cliente se encuentra registrado entonces... updated_client_name =input('What is the updated client name?').capitalize() #Pedimos al usuario que ingrese el nuevo nombre de cliente
clients = clients.replace(client_name, updated_client_name) #Ejecutamos la funcion replace, la cual recibe dos parametros, el string a reemplazar
#y el string con el cual se remplazara al anterior
else:_client_not_found_tollgate() #sino, ejecutamos la funcion _client_not_found_tollgate() para mostrar el mensaje que no se ha encontrado el cliente(string)def delete_client(client_name):"""
Función para borrar el cliente(Remplazar por una cadena vacía)"""
global clients
if(verify_client(client_name)): #Si el cliente está registrado, entonces... clients = clients.replace(client_name +', ','') #Remplazamos el nombre concatenado con una , y un espacio y lo remplazamos por una cadena vacía
else:_client_not_found_tollgate() #sino, ejecutamos la funcion _client_not_found_tollgate() para mostrar el mensaje que no se ha encontrado el cliente(string)def _add_coma(): #el nombre de la función comienza con un guión bajo para establecer que será una funcion privada
"""
Función que sirve para agregar una coma y un espacio para separar los substrings
"""
global clients
clients +=", " #se agrega una coma y un espacio al string para separar los nuevos valores
def _get_client_name():"""
Función que sierve para obtener el nombre del cliente con el formato capitalizado
"""
returninput('What is the client name?').capitalize() #guardamos en la variable client_name el valor de los caracteres que ingresa el usuario hasta recibir un enter
if __name__ =='__main__': #funcion main
_print_welcome() #ejecutamos la funcion que da el mensaje de bienvenida
command =input().lower() #guardamos el valor del dato ingresado en la variable command pero lo convertimos a miunsculas para realizar la accion si presiona "C" o "c"if command =='c': #si el comando es igual al caracter "c" procedemos a realizar los pasos de create/crear
client_name =_get_client_name() #Ejecutamos la función para obtener el nombre del cliente
create_client(client_name) #Ejecutamos la funcion crear cliente y enviamos como parametro el valor de la variable que almacena lo que digitó el usuario
read_client_list() #Ejecutamos la funcion listar clientes
elif command =='r': #si el comando es igual al caracter "r" procedemos a realizar los pasos de read/leer
read_client_list() #Ejecutamos la funcion listar clientes
elif command =='u': #si el comando es igual al caracter "u", procedemos a realizar los pasos de update/actualizar
client_name =_get_client_name() #Ejecutamos la función para obtener el nombre del cliente
update_client(client_name)read_client_list() #Ejecutamos la funcion listar clientes
elif command =='d': #si el dato ignresado por el usuario es "d" procedemos a realizar los pasos de delete/eliminar
client_name =_get_client_name() #Ejecutamos la función para obtener el nombre del cliente
delete_client(client_name)read_client_list() #Ejecutamos la funcion listar clientes
else:print('ERROR: Invalid command') #Si el usuario no digita alguna de nuestras opciones entonces mostramos un mensaje de error
input() #Escribimos un input para que el programa haga una pausa y no cierre la ventana hasta recibir un enter
Gracias
Creo que mientras mas avanzo mas me gusta esto, comparto mi codigo con funcion de accion y validar si existe cliente.
clients='pablo,ricardo,'def create_client(client_name): global clients
if client_name not inclients: clients+=client_name
_add_comma()else:print('Client already is in the clien\'s list ')def list_clients(): global clients
print(clients)def update_client(client_name,updated_client_name): global clients
if client_name inclients: clients=clients.replace(client_name+',',updated_client_name+',')else:print('Client is not in clients list')def delete_client(client_name): global clients
_exist_client(client_name)Exist_client=_exist_client(client_name)print(Exist_client)ifExist_client==True: clients=clients.replace(client_name+',','')def _exist_client(client_name): global clients
if client_name not inclients:print('Client is not in clients list')returnFalse elif client_name is None or client_name=='':print('Client is Empty')returnFalseelse:returnTruedef _add_comma(): global clients
clients+=','def _print_welcome():print('WELCOME TO BOLTA VENTAS')print('*'*50)print('What would you like to do today?')print('[C]reate client')print('[U]pdate client')print('[D]elete client')#def _get_client_name():# returninput('what is the client name?')#def _get_updated_client_name():# returninput('what is the updated client name?')def _get_input_action(value): action=''if value ==1: action=input('what is the client name?')_exist_client(action) elif value ==2: action=input('what is the updated client name?')_exist_client(action)else: action=print('Invalid value for input action')return action
if __name__ =='__main__':_print_welcome() command=input() command=command.upper()if command =='C': client_name =_get_input_action(1)create_client(client_name)list_clients() elif command =='D':list_clients() client_name =_get_input_action(1)delete_client(client_name)list_clients() elif command =='U':list_clients() client_name =_get_input_action(1)#_get_client_name() updated_client_name =_get_input_action(2)#_get_updated_client_name()update_client(client_name,updated_client_name)list_clients()else:print('Invalid command')
Estamos igual jajaja, me encanta.
Saludos, les comparto mi código. Trabaje con Arrays en lugar de una variable tipo str.
clients =['Ramiro','Daniel','Jose']def create_client(client_name): global clients
ifclient_exists(client_name):_message_system(1)else: # clients += client_name
# _add_coma() clients.append(client_name)def delete_client(client_name): global clients
ifclient_exists(client_name): # clients = clients.replace(client_name,'') clients.remove(client_name)else:_message_system(2)def update_client(client_name, new_client_name): global clients
ifclient_exists(client_name): # clients = clients.replace(client_name, new_client_name) pos = clients.index(client_name) clients.pop(pos) clients.insert(pos, new_client_name)else:_message_system(2)def client_exists(client_name): global clients
# if client_name+','inclients:if client_name inclients:returnTruedef _add_coma(): global clients
clients +=', 'def list_client(): global clients
# print(clients)for client inclients:print(client)def _print_menu():print(('*'*50)+'\nWELCOME TO PLATZI VENTAS\n'+('*'*50))print('What do you like to do today?')print('[C]reate client.')print('[U]pdate client.')print('[D]elete client.')print('[L]ist clients')print('[E]xit')def _message_system(num_message):if num_message ==0:returnprint('Thanks for everything.\nHave a nice day.') elif num_message ==1:returnprint('Client already is in the client\'s list!.') elif num_message ==2:returnprint('Client isn\'t in the client\'s list!.') elif num_message ==3:returnprint('Invalid command.')def _get_cliente_name():returninput('What is the client name?.\n').capitalize()def crud_scheme():whileTrue: command =input('\nOption:\t').upper()if command =='C': client_name =_get_cliente_name()create_client(client_name) elif command =='D': client_name =_get_cliente_name()delete_client(client_name) elif command =='U': client_name =_get_cliente_name()ifclient_exists(client_name): update_client_name =input('Please, Write the new client name:\n').capitalize()update_client(client_name, update_client_name)else:_message_system(2) elif command =='L':list_client() elif command =='E':_message_system(0)breakelse:_message_system(3)if __name__ =='__main__':_print_menu()crud_scheme()```
esta es la manera que construi mi funcion.
construi una funcion privada para refactorizar mi codigo un poco y reutilizar el tollgate de cliente no encontrado.
Cual es tu editor de texto?
Para no repetir el mensaje decidí crear una función auxiliar en la cual dependiendo un código, me imprime el mensaje que necesito. Aquí mismo puedo ir agregando mensajes genéricos que se irán utilizando en la aplicación.
No seria mas eficiente poner remove en vez de dejar un string vacio ? .
Saludos muy buen curso !!!
lo sería pero los nombres son una cadena de texto no un array
@frankromero muchas gracias por la aclaración y valioso aporte
Aquí les dejo mi código, pueden aprender de el, intenten leerlo y mejoren su capacidad lectora como programadores <3
global_clients ='Iván, Paolo, Platzi'def create_client(client_name): global global_clients
if client_name not in global_clients and len(global_clients)>1:# La condicional "and len(global_clients) > 1" es porque cuando borras todos los clientes
# e intentas crear uno nuevo la lista queda así ", nombre" y eso se ve mal
global_clients +=', '+ client_name
elif client_name not inglobal_clients: global_clients += client_name
# En este elif colocamos el cliente sin coma, el elif solo se comple si no hay ningun cliente en global_clients
else:print('repeated client')def update_client(client_name, updated_name): global global_clients
if client_name inglobal_clients: global_clients = global_clients.replace(client_name, updated_name)else:print('nonexistent client')def delete_client(client_name): global global_clients
if client_name in global_clients and client_name !='':# la condicional "and client_name != ''" es para que si no colocas nada, no se borren las comas, pruebenlo para ver que pasa
global_clients = global_clients.replace(client_name +', ','') # Estas lineas de codigo son
global_clients = global_clients.replace(', '+ client_name,'') # para que se vea bien esteticamente
global_clients = global_clients.replace(client_name,'') # y que no haya comas flotando o dobles comas
else:print('nonexistent client')def read_clients():print(global_clients)def _menu():print(' WELCOME')print('-'*40) # El*40 repetira el simbolo "-"40 veces
print('What would you like to do today?')# CRUDC= create |R= read |U= update |D=deleteprint('1 = Create a client')print('2 = Read clients')print('3 = Update client')print('4 = Delete a client')print('0 = Exit')if __name__ =='__main__': _command ='1'while _command !='0': # Estewhile es para que a menos que el comando sea 0, siga saliendo el menu infinitamente
_menu() _command =input()if _command =='1':create_client(input('What is the name of the client? ')) elif _command =='2':read_clients() elif _command =='3':update_client(input('What is the name of the client? '),input('What is the updated client name? ')) elif _command =='4':delete_client(input('What is the name of the client? '))
Si alguien así como yo se quedó con la duda de por que usar if name == 'main': , en el siguiente link viene una muy buena explicación:
Gracias por la información. De eso se trata, de saber el fondo de las cosas.
Que emocionante! Me muero por saber como manejar clases y guardar datos en el disco duro :D
CRUD: Create, Replace, Update, Delete.
Supongo, no?
CRUD: Create, Read, Update, Delete
"Read" seria la opción de listar los clientes. El "replace" entraría implícitamente en la opción "Update", donde reemplazas (o modificas) la información.
def _client_exists(client_name): global clients
if client_name+','inclients:returnTrueelse:print('Client is not in client list.')
Lo acomode de la siguiente manera:
def update_client(client_name, update_client_name): global clients
if_find_client(client_name): clients = clients.replace(client_name, update_client_name)def delete_client(client_name): global clients
if_find_client(client_name): clients = clients.replace(client_name +',','')def _find_client(client_name): global clients
if client_name inclients:returnTrueelse:print('Client is not in clients list')returnFalse
De todo esto me queda una inquietud con la variable "clients", porque esta se declara global dentro de las funciones, y no por fuera de una sola vez
creo que es por que las funciones no pueden acceder directamente a la variable clients
¡Hola @jandresovallos! La variable clients se declara de manera global para que pueda ser accedida por todas las otras funciones. En programas que pretenden escalar, esto es una mala práctica. Nunca deberías declarar una variable a nivel global. Por cuestiones de practicidad y por la corta longitud del código se hace aquí. Espero que mi respuesta te aclare la duda ;)
<code>clients ='pablo, ricardo,'def create_client(client_name): global clients
if client_name not inclients: clients += client_name
_add_comma()else:print('client already is in the client\'s list')def list_clients(): global clients
print(clients)def update_client(client_name, updated_client_name): global clients
if client_name inclients: clients = clients.replace(client_name +',', updated_client_name +',')else:print(_get_not_in_list())def delet_client(client_name): global clients
if client_name inclients: clients = clients.replace(client_name +',','')else:print(_get_not_in_list())def _add_comma(): global clients
clients +=','def _print_welcome():print('welocome to platzi ventas')print('*'*50)print('what would you like to do today?')print('[C]reate client')print('[U]pdate client')print('[D]elate client')def _get_client_name():returninput('What is the client name?')def _get_not_in_list():returninput('client is nos in client list')if __name__ =='__main__':_print_welcome() command =input() command = command.upper()if command =='C': client_name =_get_client_name()create_client(client_name)list_clients() elif command =='D': client_name =_get_client_name()delet_client(client_name)list_clients() elif command =='U': client_name =_get_client_name() updated_client_name =input('whats the o¡updated client name?')update_client(client_name, updated_client_name) list_clients
else:print('Invalid command')
Patrón Común (CRUD):
-Crear cliente
-Mostrar clientes
-Hacer update de clientes
-Borrar clientes,
*Es un patrón que nos vamos a encontrar por todos lados:Aplicaciones web que tengan(Apis), aplicaciones de escritorio(Gmail,Bloc de notas), Cualquier cosa que represente la programación, que requiera guardar, modificar, etc "VAMOS A NECESITAR ESTE PATRÓN"
yo use una lista, me parece mejor y mas ordenado
clients =["pablo","ricardo",]def add_client(client_name): global clients
if client_name not inclients: clients.append(client_name)print("")print("Client Created".center(50,"*"))else:print("The client {} was already created".format(client_name).center(50))def list_clients(): global clients
print(clients)def _update_client(client_name): global clients
if client_name inclients: update_name =str(input("What is the new client name? ")) clients.remove(client_name) clients.append(update_name)print("")print("Update Client Name".center(50,"*"))else:print("The client {} does not exist".format(client_name).center(50))def delete_client(client_name): global clients
if client_name inclients: clients.remove(client_name)print("")print("Client Removed".center(50,"*"))else:print("The client {} is not in clients list".format(client_name).center(50))def _get_client_name():returninput("What is the client name? ")def run():whileTrue: command =str(input("""
What would you like to do today?[C]reate client
[U]pdate client
[D]elete client
[S]how clients
[E]xit
:""")) command = command.upper()if command =="C":print("Create client".center(50,"="))print("") client_name =_get_client_name()add_client(client_name)print("")list_clients() elif command =="U":print("Update client".center(50,"="))print("") client_name =_get_client_name()_update_client(client_name)print("")list_clients() elif command =="D":print("Delete client".center(50,"="))print("") client_name =_get_client_name()delete_client(client_name)print("")list_clients() elif command =="S":print("Show clients".center(50,"="))print("")list_clients() elif command =="E":print("GOOD BYE".center(50,"="))breakelse:print("Command invalid")if __name__ =="__main__":print("WELCOME TO PLATZI VENTAS".center(50,"="))run()
Buena clase, esto se va poniendo más y más interesante.
También es una buena idea utilizar un array/lista y ocupar .remove() para borrar el nombre del cliente, se me hizo más sencillo de esa manera.