Básicos del Lenguaje

1

Guía de instalación y conceptos básicos

2

Archivos y slides del curso práctico de Python

3

IMPORTANTE: Instalando Ubuntu Bash en Windows para facilitarte el seguimiento del curso desde Windows.

4

¿Qué es la programación?

5

¿Por qué programar con Python?

6

Operadores matemáticos

7

Variables y expresiones

8

Presentación del proyecto

9

Funciones

10

Usando funciones en nuestro proyecto

11

Operadores lógicos

12

Estructuras condicionales

Uso de strings y ciclos

13

Strings en Python

14

Operaciones con Strings en Python

15

Operaciones con strings y el comando Update

16

Operaciones con strings y el comando Delete

17

Operaciones con strings: Slices en python

18

For loops

19

While loops

20

Iterators and generators

Estructuras de Datos

21

Uso de listas

22

Operaciones con listas

23

Agregando listas a nuestro proyecto

24

Diccionarios

25

Agregando diccionarios a nuestro proyecto

26

Tuplas y conjuntos

27

Tuplas y conjuntos en código

28

Introducción al módulo collections

29

Python comprehensions

30

Búsquedas binarias

31

Continuando con las Búsquedas Binarias

32

Manipulación de archivos en Python 3

Uso de objetos y módulos

33

Decoradores

34

Decoradores en Python

35

¿Qué es la programación orientada a objetos?

36

Programación orientada a objetos en Python

37

Scopes and namespaces

38

Introducción a Click

39

Definición a la API pública

40

Clients

41

Servicios: Lógica de negocio de nuestra aplicación

42

Interface de create: Comunicación entre servicios y el cliente

43

Actualización de cliente

44

Interface de actualización

45

Manejo de errores y jerarquía de errores en Python

46

Context managers

Python en el mundo real

47

Aplicaciones de Python en el mundo real

Conclusiones finales

48

Python 2 vs 3 (Conclusiones)

Clases bonus

49

Entorno Virtual en Python y su importancia: Python en el mundo real

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Actualización de cliente

43/49
Recursos

Aportes 25

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Hay dos errores potenciales, en el codigo que se ve en el video, pasa que no entiendo porque platzi recorta los videos y deja a los alumnos con un mal sin sabor… no me gusta esto para anda…

primero que todo el metodo

<def _save_to_disk(updated_clients):
        tmp_table_name = self.table_name + '.tmp'
        with open(tmp_table_name) as f:
            writer = csv.DictWriter(f, fieldnames=ClientModel.schema())
            writer.writerows(updated_clients)

        os.remove(self.table_name)
        os.rename(tmp_table_name, self.table_name)>

esta mal codificado, le falta el parametro del objeto actual self
y el mode para la funcion open, deberia de quedar asi.

<def _save_to_disk(self, updated_clients):
        tmp_table_name = self.table_name + '.tmp'
        with open(tmp_table_name, mode='w') as f:
            writer = csv.DictWriter(f, fieldnames=ClientModel.schema())
            writer.writerows(updated_clients)

        os.remove(self.table_name)
        os.rename(tmp_table_name, self.table_name)>

Me costó mucho entender estos dos ultimos videos, los ví graves, se saltaron explicaciones importantes, creo que todo está muy fuera de contexto, algún esquema inicial, introduccion a click y por qué se usa ese esquema de carpetas sería de gran ayuda, aparte la explicación de POO es muy pobre, siento que ahí fallaron un poco.

Así me funciono def_save_to_disk

<	def _save_to_disk(self, clients):
		tmp_table_name = self.table_name + '.tmp'
		with open(tmp_table_name, mode='a') as f:
			writer = csv.DictWriter(f, fieldnames=Client.schema())
			writer.writerows(clients)

		os.remove(self.table_name)
		os.rename(tmp_table_name, self.table_name)>

Error en el segundo 3:45 deben agregar el modo en el que abren el archivo, sino les dará error.
Escriban lo siguiente:

with open(tmp_table_name, mode = 'w') as f:

Una consulta, por que a David le funciona sin colocar el self en la funcion _save_to_disk?

def _save_to_disk(self,clients):
		tmp_table_name = self.table_name+'.tmp'
		with open(tmp_table_name,mode='as') as f:
			writer = csv.DictWriter(f, fieldnames=Client.schema())
			writer.writerows(clients)
		os.remove(self.table_name)
		os.rename(tmp_table_name, self.table_name)

He llegado a este punto sin entender casi nada de lo que se ha hecho con POO en Python, es demasiado contenido para el ultimo bloque, si llegaron hasta aqui y no entendieron casi nada, toca regresar y analizar leccion por leccion junto con el codigo, ademas de hacer busqueda de los temas que queden en duda

creo que estaría muy bien hacer un esquema previo con lo que se va hacer con los pasos y el resultado y final y porque es asi y no de otra manera y quizá estaría interesante saber todo lo que le falta…

Decepcionante cómo un curso que en sus inicios era tan fantástico decae por decisiones tan paupérrimas como “terminar rápido la grabación” o no hacer un curso tan extenso.
Creo que todos estamos aquí por aprender y no por sacar certificados de manera pronta. Bajo esa misma lógica, considero que la calidad del curso debe primar por encima de todo, independientemente de si las explicaciones duran 5 minutos o 40.
Platzi team, reevaluen la calidad de este curso, nos están fallando a nosotros como clientes y principalmente como estudiantes.

Es mala practica llamar “updated_client” a un ´´argumento´´ y llamar “updated_clients” a una ´´variable´´ dentro de una funcion??

El código del profe estaba incompleto, el mismo IDE dice apenas se escribe self que algo falta. en la clase 39 esta el código del profe, pero aquí les comparto si quieren adicional ver con list comprehension.

  • 'w'open for writing, truncating the file first

Ya vamos comprendiendo mejor el tema

Es un buen profesor la verdad explica muy bien y detalladamente, he visto algunas quejas sobre algunas de las ultimas clases, pero es que se enseña el uso de un lenguaje no de un framework, mucho no comprenden eso, no se intenta profundizar en el framework, el proyecto final es mas para ver como podemos aplicar lo aprendido y usarlo en el mundo real y si nos llama la atención el framework nos motiva a investigar mas sobre el.
 
Como yo que le tengo un cariño inmenso a Qt y lo descubrí gracias a que un programa de animacion que es mi favorito de código abierto. Pero solo aprendí a usarlo en C++ y me toco investigar el como usarlo en python y créanme no hay info ni tutos que lo explique, en español ni en ingles (en su modo vainilla y no con diseñadores gráficos con QtDisigner) así que me toco ver su documentación directa del framework en su pagina oficial.
 
Por eso creo que el profesor hizo un excelente trabajo enseñándonos el lenguaje y en sus ultimas clases nos dio la oportunidad de interesarnos por un framework que puede convertirse en uno de nuestros favoritos o no.
 
“PD: cuando leia las frases: – no explica ha profundidad el uso de CLICK o que esta fuera de contexto, cosas y asi-- lo que lei fue: soy un perezoso que no le gusta investigar”

En la parte de abajo de la descripción de habla sobre errores. Eso no pertenece a este curso

La verdad nunca pude ejecutar nada en el cmd, cuando le doy pv --help, o pv client create, etc simplemente no hace nada.
Logré crear el ambiente virtual, y creo que pude ejecutar lo de pip install --editable .
Si le doy where pv, me da dos rutas, el pv.py y uno en pytho38 en el disco C
¿Alguien podría ayudarme? Hice las clases, copié el código, etc, pero la verdad hace como 5 clases que me perdí horrible y no entiendo ni lo que hemos hecho.

Lo más útil del curso fue saber que existía click y que de alguna manera nos puede ayudar para lo que buscamos… pero no más. Para aprenderlo nos va tocar navegar por internet y buscar información gratuita que no conseguimos en un sitio de PAGO como lo es Platzi.
No tiene sentido, estoy sumamente defraudado, deberían grabar nuevamente este curso pero con Facundo que sí sabe organizar sus ideas.

Desde la clase 39 en adelante me ha constado mucho entender 😦.

Hice un agregado al codigo, ya que si no encuentra el Client a modificar, igualmente va a tener que guardar toda la información, con una condicionar y return se puede arreglar o evitar.

...
        if client_list == updated_clients:
            return # No changes in Clients db, skip rewrite
...

Compañeros mexicanos, en su país dicen “ciclar” o dicen “iterar”?

Mi reto cumplido

commands.py

@clientes.command()
@click.argument('client_uid',
              type=str)
@click.pass_context
def delete(ctx, client_uid):
    """Elimina un cliente"""
    client_service = ClienteService(ctx.obj['clients_table'])
    client_list = client_service.list_clients()
    client = [client for client in client_list if client['uid'] == client_uid]
    if client:
            ##Desmpaqueta el diccionario al modelo de ClientModel
            client = ClienteModel(**client[0])
            client_service.delete_client(client)
            click.echo('Client deleted')
    else:
            click.echo('ID not in list')

services.py

    def delete_client(self, client_removed):
        clients = self.list_clients()
        for client in clients:
            if client['uid'] == client_removed.uid:
                clients.remove(client)
        self._save_to_disk(clients)

implementacion inicial de actualizar y eliminar

se implementan dos metodos
actualizar
se modifico 2 Archivos
service.py
se agrego funcion update_client() //metodo que recive un obejto cleinte y guarda
se agrego funcion _save_to_disk() //guardamos en disco la lista de clientes
commands.py
se modifica update_client() //metodo que espera un parametro uid del cleinte
// y se envia y genera un un flujo de actualizacion _update_client_flow()
// y se actuliza usando el metodo update_client() de la clase Clientservice
se agrego funcion _update_client_flow() //metodo que genera flujo con el usuario para actualizar datos del cleinte

eliminar
se modifico 2 Archivos
service.py
se agrego delete_client() //metodo que recive un obejto cliente elimina y guarda
commands.py
se modifica delete_client() //metodo que espera un parametro uid del cliente
//y se elimina usando el metodo delete_client() de la clase Clientservice

Hasta ahora no me funciona! ME dice que pv no lo reconoce como una comando a pesar de seguir las instruccions! Un companero comentO que instale sudo apt install pv pero no en windows me dice que no reconoce windows ni apt
Lo intento hacer en bash pero al activar el entorno virtual me aparece:

lksengineer@DESKTOP-U6E9MPM:/mnt/c/PYTHON/PYTHON/CRUD/PLATZI-VENTAS$ source venv/Scripts/activate
: command not found
: command not found

y si lo intento activar como lo instalo en la cmd

lksengineer@DESKTOP-U6E9MPM:/mnt/c/PYTHON/PYTHON/CRUD/PLATZI-VENTAS$ venv/Scripts/activate
venv/Scripts/activate: line 3: $'\r': command not found
venv/Scripts/activate: line 4: $'\r': command not found
venv/Scripts/activate: line 10: syntax error near unexpected token `$'{\r''
'env/Scripts/activate: line 10: `deactivate () {

Esta algo complicado me costo entender pero el punto es devolverse para fijarse tomar nota analizar y probar tu mismo! sigamos avanzando🔥

No olviden que en clases anteriores nos pasaron los archivos con todo el código.

.
Es de gran ayuda poder comparar y dar seguimiento pues en esta ocasión se les fue un error. **Muchas gracias también a todos los que han compartido el código para seguir avanzando, siempre grandes aportes.
.
Mi código:

def update_client(self, updated_client):
        clients = self.list_clients()
        updated_clients = []

        for client in clients:
            if client['uid'] == updated_client.uid:
                updated_clients.append(updated_client.to_dict())
            else:
                updated_clients.append(client)
        
        self._save_to_disk(updated_clients)
    
    # Para guardar la lista actualizada en el disco utilizamos el método privado _save_to_disk()
    def _save_to_disk(self, clients):
        tmp_table_name = self.table_name + '.tmp'
        with open(tmp_table_name, mode='w') as f:
            writer = csv.DictWriter(f, fieldnames= Client.schema())
            writer.writerows(clients)

        os.remove(self.table_name)
        os.rename(tmp_table_name, self.table_name)

next

No entiendo para qué las condicionales dentro del for-loop si a la final lo que hace es pasar los clientes de una lista a otra, incluyendo al cliente actualizado