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

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

42/49
Recursos

Aportes 33

Preguntas 9

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Tablas con mejor formato
隆Hola a todos! Les comparto una mejora que le hice al c贸digo para que la tabla tenga un mejor formato.
Utilic茅 un m贸dulo llamado Tabulate, que pueden encontrar en la p谩gina oficial de PyPI o solo instalarlo con $ pip install tabulate.

El c贸digo del m茅todo list queda as铆:

from tabulate import tabulate

@clients.command()
@click.pass_context
def list(ctx):
    """List all clients"""
    client_service = ClientService(ctx.obj['clients_table'])
    clients_list = client_service.list_clients()

    headers = [field.capitalize() for field in Client.schema()]
    table = []

    for client in clients_list:
        table.append(
            [client['name'],
             client['company'],
             client['email'],
             client['position'],
             client['uid']])

    print(tabulate(table, headers))

El resultado:

Les recomiendo leer un poco m谩s acerca del funcionamiento del m贸dulo aqu铆.

Deber铆an compartir el c贸digo por que el mio no funciona y no tengo con que compararlo鈥

Muy interesante, l谩stima que a muchos no nos haya servido.
Al ejecutar no aparece nada. 馃槓
Un poco de calma, sobretodo al principio, hubiese sido de mucha ayuda.

Qu茅 diferencia hay entre:
mode=鈥榓鈥 y mode=鈥榳鈥?
Uno a帽ade y el otro escribe, pero si escribes no est谩s a帽adiendo?

Yo implement茅 asi el for:

 for client in client_list:
        name, company, email, position, id = list(client.values()) # Guarda los valores.
        print(f"{id} | {name} | {company} | {email} | {position}")

Con PrettyTable tambi茅n es posible formatear la tabla en la consola.

from prettytable import PrettyTable

@clients.command()
@click.pass_context
def list(ctx):
    """List all clients"""
    client_service = ClientService(ctx.obj['clients_table'])
    clients = client_service.list_clients()

    table = PrettyTable()

    table.field_names = [c.upper() for c in Client.schema()]
    for client in clients:
        table.add_row([
            
            client['name'],
            client['company'],
            client['email'],
            client['position'],
            client['uid'],
        ])

    click.echo(table)

Me gener贸 una inquietud y es que el profesor coloc贸 una funci贸n en el archivo commands.py la cual tiene como nombre list y pues se supone que es una keyword reservada de Python, lo extra帽o es que no le haya fallado.

馃檵Aqui:
馃憠Archivos de la clase 43:
commands.py
services.py

al ejecutar mi programa me manda el siguiente error :

File 鈥淐:\platzi-ventas\lib\site-packages\click\decorators.py鈥, line 71, in _make_command
raise TypeError('Attempted to convert a callback into a '
TypeError: Attempted to convert a callback into a command twice.

Alguien sabe a que se refiere ?

Fant谩stico el uso del Framework Click para la creaci贸n de API鈥檚
La funci贸n click.echo(), que en muchos sentidos funciona como la declaraci贸n print o funci贸n de Python. La principal diferencia es que funciona igual en Python 2 y 3, detecta inteligentemente los flujos de salida mal configurados y nunca fallar谩 (excepto en Python 3)

Para las personas que quieran practicar con una clase para mejorar la visualizaci贸n de la data, les comparto este package
https://pypi.org/project/beautifultable/
Tanto su documentaci贸n como varios ejemplos de uso aparecen all铆.

Implementacion inicial de lista de clientes
se modificos 2
services.py
se agrego funcion list_clients //metodo para leer csv a un objeto lista usando
//el metodo estatico de clase client
command.py
se modifico el metodo list_clients
se intancia la clase ClientServices con los paremetro nombre de la tabla de contexto
en la variable client_service se hace referencia a nuestra clase Client_service
//trae el listado de clientes
en la variable lista client_list se accesa al metodo de la variable client_service
instanciada al metodo list_clients
//se crea encabezado de datos a mostrar
//iteramos a lo largo de nuestra lista de clientes

Commands.py

import click
from clients.services import ClientServices
from clients.models import Client


@click.group()
def clients():
    """ Manages the clients lifecycle"""
    pass


@clients.command()
@click.option('-n', '--name',
                type=str,
                prompt=True,
                help='The client name')

@click.option('-c', '--company',
                type=str,
                prompt=True,
                help='The client Company')
                

@click.option('-e', '--email',
                type=str,
                prompt=True,
                help='The client email')


@click.option('-p', '--position',
                type=str,
                prompt=True,
                help='The client position')



@click.pass_context
def create(ctx, name, company, email, position):
    """Create a new client """
    client = Client(name, company, email, position)
    client_service = ClientServices(ctx.obj['clients_table'])

    client_service.create_client(client)


@clients.command()
@click.pass_context
def list_clients(ctx):
    """List all clients"""
    client_services = ClientServices(ctx.obj['clients_table'])
    client_list = client_services.list_clients()

    click.echo('  ID  |  NAME  |  COMPANY  |  EMAIL  |  POSITION')
    click.echo('*'*50)

    for client in client_list:
        print('{uid}  |  {name}  |  {company}  |  {email}  |  {position}'.format(
            uid = client['uid'],
            name = client['name'],
            company = client['company'],
            email = client['email'],
            position = client['position']
        ))

@clients.command()
@click.pass_context
def update(ctx, client_name):
    """Update a client """


@clients.command()
@click.pass_context
def delete(ctx, client_name):
    """Delete a client"""
    pass

all = clients

services.py

import csv
from clients.models import Client

class ClientServices:
    def __init__(self, table_name):
        self.table_name = table_name
    

    def create_client(self, client):
        with open(self.table_name, mode='a') as f:
            write = csv.DictWriter(f, fieldnames=Client.schema())
            write.writerow(client.to_dict())
    

    def list_clients(self):
        with open(self.table_name, 'r') as f :
            reader = csv.DictReader(f, fieldnames=Client.schema())

            return list(reader)

Aunque realmente click no se vaya a usar mucho en la carrera, pues no creo que haya usuarios finales ejecutando desde la terminal, pero para los programadores si vale la pena como para que se vea m谩s especial 馃檰鈥嶁檪锔弝 de paso se pone en pr谩ctica decoradores.

los enga帽e min 6:00 jajajajaja tan chistoso :v

quedo buenisimo con la libreria tabulate

from email import header
import click
from tabulate import tabulate

from clients.services import ClientService
from clients.models import ClientModel

@click.group()
def clients():
    """Manages the clients lifecycle"""
    pass


@clients.command()
@click.option('-n', '--name',    # nombre y su abreviacion para acceder a este comando.
                type = str,      # tipo String es lo que almacena
                prompt = True,   # si no me lo dan en la funcion se lo pedimos al usuario
                help = 'The client\'s name') # mostrar ayuda
@click.option('-c', '--company',
                type = str,
                prompt = True,
                help = 'The client\'s company')
@click.option('-e', '--email',
                type = str,
                prompt = True,
                help = 'The client\'s email')
@click.option('-p', '--position',
                type = str,
                prompt = True,
                help = 'The client\'s position')


@click.pass_context
def create(ctx, name, company, email, position):
    """Create a new client """
    client =  ClientModel(name, company, email, position)
    client_service = ClientService(ctx.obj['clients_table'])
    client_service.create_client(client)


@clients.command()
@click.pass_context
def list(ctx,):
    """List all clients"""
    client_service = ClientService(ctx.obj['clients_table'])
    clients_list = client_service.list_clients()
    #click.echo(' ID | NAME | COMPANY | EMAIL | POSITION')
    headers = [field.capitalize() for field in ClientModel.schema()]
    #click.echo("-"*100)
    body = []
    for client in clients_list:
        """
        click.echo('{uid} | {name} | {company} | {email} | {position}'.format(
            uid= client['uid'],
            name = client['name'],
            company =  client['company'],
            email = client['email'],
            position = client['position']))
        """
        body.append(
            [client['name'],
             client['company'],
             client['email'],
             client['position'],
             client['uid']])
    click.echo(tabulate(body ,headers))

@clients.command()
@click.pass_context
def update(ctx,client_uid):
    """Updates a client"""
    pass


@clients.command()
@click.pass_context
def delete(ctx, client_uid):
    """Delete a client"""
    pass


all = clients

hay convenciones para dar ejemplos de nombres, pueden nombres peque帽os o tambi茅n fu y var.

print tiene diferentes ejecuciones en los sistemas operativos, por lo que para imprimir algo es mucho mejor utilizar click.echo

Interesante me llamo mucho la atencion ese metodo .echo hice una peque帽a investigacion de el y encontre este post esta genial practicamente se puede reemplazar por un print

Click documentation

genial u.u., toca repasar el curso

me aparece este error cuando trato de crear un nuevo usuario desde cmd
TypeError: init() got an unexpected keyword argument 鈥榩romp鈥

Super

cuando creo un cliente desde cmd con pv clients create no me permite crearlo

Estoy usando git bash desde windows y me gener贸 algunos problemas el caract茅r de nueva l铆nea cuando python maneja los archivos. Para solucionarlo defin铆 el par谩metro de newline en el comando open de la siguiente manera:

open(self.table_name, mode='r', newline='')

Creo que todos los que usen Windows les afecta, pero no estoy seguro.

Amigos, necesito algo de ayuda, inicialic茅 el ambiente e instal茅 el m贸dulo pv, pero no estoy pudiendo utilizar el programa pv, me comenta que:

/Users/davidbehar/David: bad interpreter: No such file or directory

me aparece este error cuando trato de crear un usuario o cuando escribo en cmd pv clients help

Traceback (most recent call last):
File 鈥淐:\Users\LeoVanXavi\Documents\programas_en_python\platzi-ventas\pv.py鈥, line 4, in <module>
from clients import commands as clients_commands
File 鈥淐:\Users\LeoVanXavi\Documents\programas_en_python\platzi-ventas\clients\commands.py鈥, line 62, in <module>
@click.pass_context
File 鈥淐:\Users\LeoVanXavi\Documents\programas_en_python\platzi-ventas\env\lib\site-packages\click\decorators.py鈥, line 173, in decorator
_param_memo(f, OptionClass(param_decls, **option_attrs))
File 鈥淐:\Users\LeoVanXavi\Documents\programas_en_python\platzi-ventas\env\lib\site-packages\click\core.py鈥, line 1547, in init
Parameter.init(self, param_decls, type=type, **attrs)
TypeError: init() got an unexpected keyword argument 鈥榩romp鈥

Interfaz para la lista de los cliente:

@clients.command()
@click.pass_context
def list(ctx):
  """List all clients"""
  client_service = ClientService(ctx.obj['clients_table'])

  client_list = client_service.list_clients()

  click.echo(' ID  | NAME  | COMPANY | EMAIL | POSITION  ')
  click.echo('*' * 100)

  for client in client_list:
    click.echo(f'''{client['uid']} | {client['name']} | {client['company']} | {client['email']} | {client['position']}''')

En las primeras clases, indica que hay una convenci贸n muy interesante en Python. Es muy recomendable leerlo, puesto que uno de ellos habla de la cantidad de caracteres que debe haber por l铆nea.

Es genial, como va tomando forma todo el proyecto. Pese a que a煤n quedan algunas dudas, lo mejor es leer. Ya me dec铆a un profesor RTFM.

Al ejecutarlo me dec铆a que un Group objeto no es iterable por lo que tuve que cambiar el for as铆:

@clients.command()
@click.pass_context
def list(ctx):
	"""List all clients"""
	client_service=ClientService(ctx.obj['clients_table'])
	client_list=client_service.list_clients()
	click.echo('ID  |  NAME  |  COMPANY  |  EMAIL  |  POSITION')
	click.echo('*'*100)
	
	for client in client_list:
		click.echo('{uid} | {name} | {company} | {email} | {position}'.format(
			uid=client['uid'],
			name=client['name'],
			company=client['company'],
			email=client['email'],
			position=client['position']) )```

a seguir practicando, ya va tomando forma. y captando mejor

si hago el comando para ver la lista de clientes y la ventana de la consola es peque帽a, me muestra la lista completa, pero cuando la pongo pantalla completa, quita el ultimo cliente(si ya habia hecho el comando con la ventana peque帽a)
que curioso ._., creeria que no es por mi codigo, si alguien mas le pasa me gusaria saber
NOTA: utilizo Linux

commands.py

<import click

from clients.services import ClientServices
from clients.models import Client

@click.group()
def clients():
    """Manages the clients lifecycle"""
    pass


@clients.command()
@click.option('-n', '--name',
                type=str,
                prompt=True,
                help='The client name')
@click.option('-c', '--company',
                type=str,
                prompt=True,
                help='The client company')
@click.option('-e', '--email',
                type=str,
                prompt=True,
                help='The client email')
@click.option('-p', '--position',
                type=str,
                prompt=True,
                help='The client position')
@click.pass_context
def create(ctx, name, company, email, position):
    """Creates a new client"""
    client = Client(name, company, email, position)
    client_service = ClientServices(ctx.obj['clients_table'])

    client_service.create_client(client)


@clients.command()
@click.pass_context
def list(ctx):
    """Lists all clients"""
    client_services = ClientServices(ctx.obj['clients_table'])

    client_list = client_services.list_clients()

    click.echo(' ID | NAME | COMPANY | EMAIL | POSITION ')
    click.echo('*' * 100)

    for client in client_list:
        click.echo('{uid} | {name} | {company} | {email} | {position}'.format(uid=client['uid'],
        name=client['name'],
        company=client['company'],
        email=client['email'],
        position=client['position']))


@clients.command()
@click.pass_context
def update(ctx, client_uid):
    """Updates a client"""
    pass


@clients.command()
@click.pass_context
def delete(ctx, client_uid):
    """Deletes a client"""
    pass


"""all points out to clients function"""
all = clients
>

services.py

<import csv

from clients.models import Client


class ClientServices:

    def __init__(self, table_name):
        self.table_name = table_name
    

    def create_client(self, client):
        with open(self.table_name, mode='a') as f:
            writer = csv.DictWriter(f, fieldnames=Client.schema())
            writer.writerow(client.to_dict())

    
    def list_clients(self):
        with open(self.table_name, mode='r') as f:
            reader = csv.DictReader(f, fieldnames=Client.schema())

            return list(reader)
>

en el modo de apertura, tenemos a de append, r de reader y w de writer.