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

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

41/49
Recursos

Aportes 84

Preguntas 21

Ordenar por:

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

Creo que se debió explicar mejor el funcionamiento de click antes de empezar a usarlo de un modo profesional, en mi caso no logro entender del todo ctx.obj creo que en esta parte se va muy rápido y se pierde uno con facilidad, deberían mejorar esta parte del curso, corazón 💚 para que mejoren esta parte

Tanto para que al final no explique bien lo más complicado.

Super complicado para mi lo que se refiere al contexto, no logre entender nada. A que se refiere, que valores tiene, porque se pasa de esa forma…

Si estás un poco perdido (como estaba yo) con el tema de importar paquetes entonces estos vídeos son para vos:

https://www.youtube.com/watch?v=t93x-vnFvP4
https://www.youtube.com/watch?v=nRieWujis4s
https://www.youtube.com/watch?v=Zf9sN-w0BVE

recomiendo estudiar los tres vídeos.

Para todos aquellos que estan confundidos con la logica que llevamos asta el momento esto es lo que yo entiendo:

<h3>Que es el modulo Click:</h3>

Click es un paquete de Python para crear hermosas interfaces de línea de comandos de una manera componible con el mínimo código necesario. Es el “Kit de creación de interfaz de línea de comandos”. Es altamente configurable pero viene con valores predeterminados razonables listos para usar.

Su objetivo es hacer que el proceso de escribir herramientas de línea de comandos sea rápido y divertido, al mismo tiempo que evita cualquier frustración causada por la incapacidad de implementar una API CLI prevista.

Clic en tres puntos:

  1. anidamiento de comandos
  2. generación automática de páginas de ayuda
  3. admite carga lenta de subcomandos en tiempo de ejecución

En pocas palabras el codigo donde el usuario selecciona las opciones se sustituye con el modulo Click

<h3>El modulo Setup</h3>

Unicamente lo utilizamos para poder instalarlo en el entorno virtual de pyton como si de un exe en windows o un dmg en mac

<h3>Los modulos en Client</h3>

toda la logica que aplicamos con las funciones se separa en tres archivos:

  1. Models
  2. Services
  3. commands
<h4>Models.</h4>

aqui convertimos la estructura del Cliente en una clase

# esto:
CLIENT_SCHEMA = ['name', 'company', 'email', 'position']

# se convierte en esto:
    @staticmethod
    def schema():
        return ['name', 'company', 'email', 'position', 'uid']
<h4>Services</h4>

En este archivo ejecutmos los comandos necesarios para guardar la informacion en el archivo la unica diferencia es que en ves de guardar la información al final de la ejecución del codigo lo hacemos cada que se ejecuta un comando:

#en ves de esto:
def _save_clients_to_storage():
    with open(CLIENT_TABLE, mode='w') as f:
        writer = csv.DictWriter(f, fieldnames=CLIENT_SCHEMA)
        writer.writerows(clients)

#se hace esto:
class ClientService:

    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())

####Commands

En este modulo realizamos la logica de la aplicación

#en ves de esto:
def crear_cliente():
    client = _get_client_field('name')

    if search_client(client):
        print('Client already is in the clients\'s list')
    else:
        clients.append(_get_Client(client))
        list_clients()


def list_clients():
    for id, client in enumerate(clients):
        print('{uid} | {name} | {company} | {email} | {position} |'.format(
            uid=id,
            name=client['name'],
            company=client['company'],
            email=client['email'],
            position=client['position']
        ))


def update_client():
    client_name = _get_client_field('name')

    if search_client(client_name):
        for client in clients:
            if client['name'] == client_name:
                index = clients.index(client)
                clients[index] = _get_Client(client_name)
                list_clients()
                break
    else:
        print('CLient is not in client\'s list')


def delete_client():
    client_name = _get_client_field('name')

    if search_client(client_name):
        for client in clients:
            if client['name'] == client_name:
                clients.remove(client)
                list_clients()
    else:
        print('CLient is not in client\'s list')


def search_client(client_name):
    for client in clients:
        if client['name'] != client_name:
            continue
        else:
            return True


def _print_welcome():
    print('Welcome to Platzi Ventas')
    print('*' * 50)
    print('What would your like to do doing')
    print('[C]reate client')
    print('[L]ist client\'s')
    print('[U]pdate client')
    print('[D]elete client')
    print('[S]earch client')


def _get_client_field(field_name):
    field = None

    while not field:
        field = input('What is the client {}? '.format(field_name))

        if field == 'exit':
            field = None
            break

    if not field:
        sys.exit()

    return field


def _get_Client(client):
    client = {
        'name': client,
        "company": _get_client_field("company"),
        'email': _get_client_field('email'),
        "position": _get_client_field("position")
    }

    return client

#Vamos realizando cada comando asi
@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 = ClientService(ctx.obj['clients_table'])
    client_service.create_client(client)


@clients.command()
@click.pass_context
def list(ctx):
    """List of clients"""
    pass


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


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


all = clients

Espero que les ayude en algo y no los confunda mas 😅

Programé todo (nunca lo probé porque nunca fuimos probando el código) y cuando le doy pv clients create, simplemente me aparece como si ejecutara el código y ya, pero no hace nada. Este problema lo tengo desde la clase pasada, siento que se volvió una carrera, llevo como 4 clases sin entender ni recibir una explicación de qué es lo que estamos usando y por qué lo estamos usando. La verdad bastante decepcionado, y más aún que ni siquiera explica los comandos.

Creo que tengo todo el código bien, pero fallé en la creación del entorno virtual, me aparece que estoy en un entorno virutal pero no cuando ejecutaba los help no recibía nada, cuando ejecuto los create no pasa nada, en fin, es bastante frustrante el ni siquiera saber qué es lo que tienes mal.

👉Aqui :👌

👉Archivos usados en esta clase:👌

commands.py
models.py
services.py
pv.py

Me arrepiento de haberme inscrito en Platzi

like si quedaste aún más confundido porque no explica el por qué de esa lógica.

BAsicamente esto fue. Así porque si y punto

El problema de este curso y del “curso de Python” es que una vez pasamos el temario de POO, el profesor se acelera mucho al explicar los módulos (en este caso Click y en el anterior curso Flask) y omite explicar los conceptos de lo que estamos viendo

Una de las ventajas de usar un IDE es que te ayuda con los errores de tipeo, tales como paso en esta clase. Les recomiendo PyCharm es muy bueno y es gratis.

La verdad el curso de python con Flask para mi fue un Fla"k"so jajaja xd, pero esto debido a que lo hacia con windows y es cierto que trabajar python con windows es horrible y en algunas otras cosas

Les recomiendo para que no tengan problema con el curso que instalen una distribución de Linux no es muy demorado aprenden bastante y se evitaran todos los problemas y errores de windows

NO se asusten Linux no muerde jeje, para que sea mas fácil creen una maquina virtual para tener una buena primera experiencia con este SO

Suerte y no es tan dificil como parece, es practica pericia y no frustrarse

Los errores de escritura a veces son algo frustrantes, especialmente cuando hay lenguajes fuertemente tipificados (que las mayúsculas y las minúsculas SON importantes).
Ej: “Clients” ¡no es igual! a “clients”

Sinceramente este curso me frustro muchisimo, empezo muy lento con cosas que ya vimos muchas veces en cursos anteriores, en cambio las cosas ‘nuevas’ no las explican mucho, tuve muchisimos errores y busque muchisima informacion en muchos lados para poder hacer funcionar el programa. sinceramente una decepcion y me hace considerar desuscribirme a platzi

Me encanta este curso, he leido muchos comentarios de que ha sido un poco complicado entender estas ultimas clases y seguir al profesor en su explicacion.

Mi unico consejo sin generar polemica, es que si no entienden algo lo buscan en internet y practicar.

Hay que reforzar esta clase y las siguientes con videos externos acerca de click, es fundamental bros

A quien le salga el error:

TypeError: create_client() takes 1 positional argument but 2 were given

Esto se debe a que en el momento de construir la función en “services.py” solo se agrego el parámetro “Self”, por lo tanto cuando envías el cliente a la función, te esta informando que debe tener 2 argumentos.

El código debería quedar así

agregar “client” como parámetro, ya estaría guardando la información directamente a archivo .CSV

Es posible que el comando “pv clients create” no funcione en windows. Por lo que es necesario tratar de realizar la instalación como aplicación nuevamente, con el comando “pip install --editable .”

Si después de esto sigue sin funcionar queda la opción de ejecutarlo con el comando de “python pv.py clients create”

en windows el comando cat es type (cat .clients.csv en windows seria type .clients.csv

hola!

al momento de ejecutar el comando sale este error , podrian ayudarme?

(venv) C:\Users\dante\Desktop\angular\python\SomaVentas\soma-ventas>sv clients create
Usage: sv clients [OPTIONS] COMMAND [ARGS]…
Try “sv clients --help” for help.

Error: No such command “create”.

para ver esta parte del curso se tiene que ver primero algún tema de modelo-vista-controlador o más en este caso modelo-interfaz-controlador para entender qué quieren hacer con click.

Interfaz:
Click está enfocado en crear la interacción con el usuario.

Controlador:
En lo demás la parte que lleva el control sobre el tratamiento de la información pedida es el archivo Services.py .

Modelo:
Por último, la parte de modelo o donde se describe la plantilla del objeto en el mundo real que es cada cliente

En mi opinión esta muy bien, es práctico, solo hay conceptos que debes conocer si quieres evitar errores, pero para eso están los cursos que no son prácticos como el de python POO, hubiera estado bueno que estuvieran disponibles los archivos hechos por el profe para descarga, habremos muchos entusiastas que queremos ir de una vez a lo práctico y por eso, nos estrellamos con todos los huecos en conocimiento que tenemos, así agilizamos el flujo del cruso.

Les aumentan un poquito la dificultad y ya todos llorando, veanlo como un reto, entiendan cada palabra que dice el profe y si no, googleen.

Esta es la parte que tienes que repetir 10 veces para poder entender bien. 😦

Gente, les recomiendo que miren bien su código, a veces, una maldita coma arruina todo el programa, me anda pasando mil veces!!! revisen su código

hay como un corte en este video, no hay una secuencia del anterior

Primero que nada no me sale como a el

Solo me sale la n: e:, cuando termino de ejecutar todo me sale un error muy raro

Traceback (most recent call last):
  File "/home/aeonics/MEGAsync/Cursos/Python/Proyecto/platzi-ventas/venv/bin/pv", line 11, in <module>
    load_entry_point('pv', 'console_scripts', 'pv')()
  File "/home/aeonics/MEGAsync/Cursos/Python/Proyecto/platzi-ventas/venv/lib/python3.7/site-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/home/aeonics/MEGAsync/Cursos/Python/Proyecto/platzi-ventas/venv/lib/python3.7/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/home/aeonics/MEGAsync/Cursos/Python/Proyecto/platzi-ventas/venv/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/aeonics/MEGAsync/Cursos/Python/Proyecto/platzi-ventas/venv/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/aeonics/MEGAsync/Cursos/Python/Proyecto/platzi-ventas/venv/lib/python3.7/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/aeonics/MEGAsync/Cursos/Python/Proyecto/platzi-ventas/venv/lib/python3.7/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/home/aeonics/MEGAsync/Cursos/Python/Proyecto/platzi-ventas/venv/lib/python3.7/site-packages/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
TypeError: create() got an unexpected keyword argument 'n'```
Estimados, Entiendo que de la forma que realiza la práctica David Aroesti en consola de linux es para no usar el comando python, pero al ejecutar los comandos en PoweShell de Windows no sale ningun error, pero no ejecuta nada. Alguien de Platzi me podría ayudar indicándome si hay alguna forma de que se ejecute correctamente en Windows asi como en el video. Si no existe forma de que se ejecute en Windows tambien me podrian indicar. Quedo a la espera de su gentil ayuda. Saludos cordiales, Félix. Adjunto imagen del comando que si se ejecuta en Linux. ![](https://drive.google.com/file/d/1hNXrSD4SwHxk7_T0INexP_fawCmxHKu6/view?usp=sharing)![](https://drive.google.com/file/d/1gz6SuwpQ7IGHVZktvi-8TF5jX1xpHjR5/view?usp=sharing)
Porque es la ultima parte para poder terminar el curso.
La verdad no se como adjuntar las imágenes de lo que les mencione en el mensaje anterior, ya les pegue la URL de googledrive, también añadí un bloque de código pero no se adjunta. Si me podrían ayudar por favor
```js ```\ ```js ```
Estimados, Entiendo que de la forma que realiza la práctica David Aroesti en consola de linux es para no usar el comando python, pero al ejecutar los comandos en PoweShell de Windows no sale ningún error, pero no ejecuta nada. Alguien me podría ayudar indicándome si hay alguna forma de que se ejecute correctamente en Windows así como en el video. Si no existe forma de que se ejecute en Windows también me podrían indicar. Quedo a la espera de su gentil ayuda. Saludos cordiales, Félix. Adjunto imagen del comando que si se ejecuta en Linux. ![](https://drive.google.com/file/d/1hNXrSD4SwHxk7_T0INexP_fawCmxHKu6/view?usp=sharing) También Adjunto imagen de como lo estoy ejecutando. ![](https://drive.google.com/file/d/1gz6SuwpQ7IGHVZktvi-8TF5jX1xpHjR5/view?usp=sharing)
![](C:\Users\patinof\Documents\EjerciciosPython)![](file:///C:/Users/patinof/Documents/EjerciciosPython/Captura.JPG)
Hasta que llegamos a lo del framework de CLICK se entendio todo el proceso. Sin embargo, llegue a las clases de CLICK y pense que con aprobar el curso de terminal y linea de comandos entenderia todo de nuevo. Me fui a aprobar ese curso y regrese y solo estoy copiando lo que hace el profe pero no se que hace y para que sirve. Talves me hace falta profundizar en algun conocimiento? Creo que hubiese sido bueno explicar que debemos saber antes de continuar mas adelante.

Super bueno lo que estamos haciendo, pero ojalá lo hubiera explicado a más detalle, porque la clase se llama “lógica de negocio” y no explico como hacía en otras clases. Toca apunta de ayudas para ir entendiendo el proceso.

Estas ultimas clases son de lo peor que he visto en Platzi

--PARA LOS QUE TRABAJAN EN WINDOWS--

Tenia problemas con la instalacion del proyecto en el entorno virtual. Estoy trabajando en windows asi que buscando un poco, logre dar con la forma de instalarlo.
Hay que escribir en la linea de comandos:

# py -m pip install --editable .

Hasta ahi, lo lograba, luego tenia porblema para encontrar el archivo pv.exe (en windows se usa where, no which)… Borre e instale todo nuevamente pero seguia sin resultados positivos… Al final hice todo desde cero, pero renombre la carpeta del proyecto usando nomenclatura PascalCase, osea ya no con el “-” que el profe usa en su proyecto; recien en este punto todo empezo a correr con normalidad.

Otro detalle es que reescribi todo, pero sin mis comentarios habituales para los programas. Les recomiendo que traten de hacerlo de esa manera, es decir, la carpeta del proyecto con un nombre sin espacios ni guiones y los archivos que se vayan creando haganlos cuidadosamente al detalle para que corra sin problemas. Ya uqe practicamente es el molde para poder crear poryectos de lineas de acomando a partir de ese.

--PARA LOS QUE TRABAJAN EN WINDOWS-- 

ojo: Primero verificar si tienes inrtalado el virtualenv y el pip
Tambien tuve que instalarlos, pero es secillo, en internet encuentras como hacerlo rapidamente

  1. py -m virtualenv #Carpeta#

  2. #Carpeta#\scripts\activate

  3. py -m pip install --editable .

  4. deactivate #Si deseas salir del entorno virtual

Malogrando se aprende, experimenten y no se frustren…

++
pv cliente create -n yeison -e @@@ -c facebook -p administrador ++
aqui se utiliza las opciones en una sola entrada por ejemplo aparece - n o --name donde al lado escribimos el dato a ingresar , seguido de -e con el correo luego - c de company escribimos la compañia - p de postiion y al lado el area del empleado

Me ayudó investigar en google la pregunta:

What is the var() function in python?

Ante lo cual obtuve la respuesta:

The var() function is part of the standard library in Python and is used to get an object's _dict_ attribute. The returned _dict_ attribute contains the changeable attributes of the object. This means that when we update the attribute list of an object, the var() function will return the updated dictionary.

Dejo un ejemplo de juguete, para el que no entendió pass_context. Tienen que poner como argumentos “–name juan english” para que funcione.

import click


@click.group()
@click.option('--name', type=str)
@click.pass_context
def cli(ctx, name):
    """
    This is a Help message
    """

    ctx.obj = {} # Inicializo el contexto como diccionario
    ctx.obj['NAME'] = name # Le meto un key value
    print(f'Hola {name}')


@cli.command()
@click.pass_context
def english(ctx):
    click.echo(f'Hello {ctx.obj["NAME"]}') # Uso el value en otra función que le pasé el objeto contexto


if __name__ == "__main__":
    cli()

No entiendo nada desde la clase de Definición de la API Publica.

Tengo el siguiente error y no consigo averiguar el porque, espero que alguien pueda ayudarme antes de volverme loco. GRACIAS

Hola, me sale este error:
client_service.create_client(client)
TypeError: create_client() takes 1 positional argument but 2 were given

import click 

from clients.services import ClientService
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 = ClientService(ctx.obj['clients_table'])

    client_service.create_client(client)
    


@clients.command()
@click.pass_context
def list(ctx):
    """List old clients"""
    pass


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


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

all = clients

y este es mi codigo

Buenas noches comunidad y señores Platzi, etaba entendiendo todo el proceso y de repente todo se vuelve confuso y rápido, quizás ya hay personas que vienen programando y comprenden con mayor facilidad, pero los que estamos arrancando en este proceso, genera confusión y ganas de parar el proceso, ya que al no entender se pierde el interés continuar con el proceso de este curso.

El método create_client recibe como argunmentos a self y a Client

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

El curso estaba excelente, sin embargo en las ultimas dos clases se perdió mucho.

En lo personal creo que los mejores cursos tienen un máximo de 25 clases con un promedio de 3-4 horas. Alargarlos para evitar dividirlos propicia a que no haya una explicación de lo que se está viendo.

From click() documentation:

Nested Handling and Contexts¶
As you can see from the earlier example, the basic command group accepts a debug argument which is passed to its callback, but not to the sync command itself. The sync command only accepts its own arguments.

This allows tools to act completely independent of each other, but how does one command talk to a nested one? The answer to this is the Context.

Each time a command is invoked, a new context is created and linked with the parent context. Normally, you can’t see these contexts, but they are there. Contexts are passed to parameter callbacks together with the value automatically. Commands can also ask for the context to be passed by marking themselves with the pass_context() decorator. In that case, the context is passed as first argument.

The context can also carry a program specified object that can be used for the program’s purposes. What this means is that you can build a script like this:

@click.group()
@click.option(’–debug/–no-debug’, default=False)
@click.pass_context
def cli(ctx, debug):
# ensure that ctx.obj exists and is a dict (in case cli() is called
# by means other than the if block below)
ctx.ensure_object(dict)

ctx.obj['DEBUG'] = debug

@cli.command()
@click.pass_context
def sync(ctx):
click.echo(f"Debug is {‘on’ if ctx.obj[‘DEBUG’] else ‘off’}")

if name == ‘main’:
cli(obj={})
If the object is provided, each context will pass the object onwards to its children, but at any level a context’s object can be overridden. To reach to a parent, context.parent can be used.

In addition to that, instead of passing an object down, nothing stops the application from modifying global state. For instance, you could just flip a global DEBUG variable and be done with it.

En cuanto entramos a la sección de click se hizo imposible seguir esta clase.
De verdad que la idea del curso es muy buena pero no se ejecutó bien, si bien entiendo que Platzi es una alternativa diferente a la educación convencional a veces habría que mirar hacia atrás para ver lo que se hace bien allá, hay que preparar mejor las clases, tener en cuenta los requisitos mínimos y realizar una planeación para el curso.
De no ser por las clases de Facundo sentiría que perdí mi dinero al inscribirme a Platzi, por favor solucionen estos inconvenientes si no quieren que sus mejores mercaderistas (sus estudiantes) hablen mal de la plataforma.

Hola, les comparto un par de lecturas sobre click para los que estan un poco perdidos:
Muestra algo similar a lo que esta haciendo el profesor con explicacion de lo que hace click.
https://pywombat.com/articles/CLI-python
Documentacion oficial de click
https://click.palletsprojects.com/en/8.0.x/

Espero que les sirva y no se rindan

Tengo el siguiente error … alguien me puede ayudar por favor:

C:\Users\EDWUARD\Python\clientsdb
(venv) λ pv clients create
Traceback (most recent call last):
  File "C:\Users\EDWUARD\Python\clientsdb\venv\Scripts\pv-script.py", line 33, in <module>
    sys.exit(load_entry_point('pv', 'console_scripts', 'pv')())
  File "c:\users\edwuard\python\clientsdb\venv\lib\site-packages\pkg_resources\__init__.py", line 473, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "c:\users\edwuard\python\clientsdb\venv\lib\site-packages\pkg_resources\__init__.py", line 2843, in load_entry_point
    return ep.load()
  File "c:\users\edwuard\python\clientsdb\venv\lib\site-packages\pkg_resources\__init__.py", line 2447, in load
    return self.resolve()
  File "c:\users\edwuard\python\clientsdb\venv\lib\site-packages\pkg_resources\__init__.py", line 2453, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "c:\users\edwuard\python\clientsdb\pv.py", line 15, in <module>
    cli.add_command(clients_commands.all)
  File "c:\users\edwuard\python\clientsdb\venv\lib\site-packages\click\core.py", line 1347, in add_command
    name = name or cmd.name
AttributeError: 'function' object has no attribute 'name'

mi codigo commands py:

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


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


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


@click.command()
@click.pass_context
def list(ctx):
    """List all Clients"""
    pass


@click.command()
@click.pass_context
def update(ctx, client_uid):
    """Update a Client"""
    pass


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


all = clients

AttributeError: ‘function’ object has no attribute ‘add_command’ le salio ese error a alguien?

También me sucedió algunos errores de dedo, se debe tener cuidado al codear jeje

implementacion inicial create

Hola a mi me muestra un error en la importacion de commands en la parte del pv,py

<import click
from clients import commands as clients_commands
# importamos de la clase commands el alias de clients_commands


CLIENTS_TABLE = '.clients.csv'
@click.group()
@click.pass_context
def cli(ctx):
    ctx.obj = {}
    ctx.obj['clients_table'] = CLIENTS_TABLE


# llamamos el all que generamos en commands
cli.add_command(clients_commands.all)
>

Hola, les comparto este error que me esta saliendo cuando ejecuto pv clients create

(venv) d:\Dropbox\PLATZY\CURSO DE PYTHON\1-BASICOS.DEL.LENGUAJE\PROYECTO\platzi-ventas>pip install --editable .
Obtaining file:///D:/Dropbox/PLATZY/CURSO%20DE%20PYTHON/1-BASICOS.DEL.LENGUAJE/PROYECTO/platzi-ventas
Requirement already satisfied: Click in d:\miniconda3\envs\venv\lib\site-packages (from pv==0.1) (7.0)
Installing collected packages: pv
  Found existing installation: pv 0.1
    Uninstalling pv-0.1:
      Successfully uninstalled pv-0.1
  Running setup.py develop for pv
Successfully installed pv

(venv) d:\Dropbox\PLATZY\CURSO DE PYTHON\1-BASICOS.DEL.LENGUAJE\PROYECTO\platzi-ventas>pv clients create
Traceback (most recent call last):
  File "D:\Miniconda3\envs\venv\Scripts\pv-script.py", line 11, in <module>
    load_entry_point('pv', 'console_scripts', 'pv')()
  File "D:\Miniconda3\envs\venv\lib\site-packages\pkg_resources\__init__.py", line 489, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "D:\Miniconda3\envs\venv\lib\site-packages\pkg_resources\__init__.py", line 2793, in load_entry_point
    return ep.load()
  File "D:\Miniconda3\envs\venv\lib\site-packages\pkg_resources\__init__.py", line 2411, in load
    return self.resolve()
  File "D:\Miniconda3\envs\venv\lib\site-packages\pkg_resources\__init__.py", line 2417, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "d:\dropbox\platzy\curso de python\1-basicos.del.lenguaje\proyecto\platzi-ventas\pv.py", line 2, in <module>
    import clients.commands as clients_commands
  File "d:\dropbox\platzy\curso de python\1-basicos.del.lenguaje\proyecto\platzi-ventas\clients\commands.py", line 19, in <module>    @click.pass_context
  File "D:\Miniconda3\envs\venv\lib\site-packages\click\decorators.py", line 173, in decorator
    _param_memo(f, OptionClass(param_decls, **option_attrs))
  File "D:\Miniconda3\envs\venv\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 'promp'

Buenas Necesito Ayuda!!! El codigo me funciona bien hasta que llega la parte de guardar un cliente, arroja este error:

File “c:\users\casa\desktop\python platzi\servidor\ventas\clients\commands.py”, line 27, in create
client_service = ClientService(ctx.obj)[‘clients_table’]
TypeError: ‘ClientService’ object is not subscriptable

Awesome!

Hola. Si pongo el comando cat .clients.csv me sale el error: cat: .clients.csv: No such file or directory
Pero si pongo cat clients.csv no marca ningún error y me trae la info guardada en el archivo. ¿Alguien sabe a qué se debe esto?

Existe un error que es bueno describirlo:

cuando importamos

from clients.models import ClientModel

No lo va a reconocer, obtendrás un error de que no se puede importar, esto se debe porque en el vídeo anterior creamos dentro de models la clase Client, no la ClientModel. En mi caso lo que hice fue cambiar el nombre de la clase a la que aparece en este vídeo: ClientModel, pero esto implica que tuve que cambiar el nombre en todos los archivos.

🧠…

el problema es que el profe usa comandos de ios o ubunto, por ejemplo en el min 6:42 en ves de “cat” . clients.csv en window (cmd) sería type .clients.csv

Hola amigos,

Al ejecutar el programa que indica el profesor:

pv clients create

y teniendo ya los datos informados (name, company,email, position)

Me da el siguiente error:

C:\Users\A169390\AppData\Local\Programs\Python\Python37-32\programas angelo\ventas\clients\commands.py, line 32, in create
client = Client(name,company,email,position)
TypeError: Client( ) takes no arguments

Alguien me podría ayudar? Gracias. Un saludo

Estructura del proyecto

.
├── clients
│   ├── commands.py
│   ├── models.py
│   └── services.py
├── pv.py
└── setup.py

Os cuesta mucho trabajo explicar las cosas en condiciones?
Sinó explicais algo en condiciones mejor ni mencionarlo
Siento decir que estas últimas clases son un desastre y sé que en Platzi lo sabéis

Busque información respecto pero no encuentra solución. Algún aporte por ahí?

“create_client() takes 1 positional argument but 2 were given”

  File "d:\archivos de programas\python\server\platzi-ventas\clients\commands.py", line 35, in create
    client_service.create_client(client)
TypeError: create_client() takes 1 positional argument but 2 were given

Me ha costado muchísimo pasar esta lección, ya llevo 3 días en esto. Ahora me aparece el siguiente error:

(venv) josevi4@CMP2DIRITPROC05:~/python-curso-CRUD/platzi_ventas$ pv clients create
Name: JOSE
Company: SPHINX
Email: [email protected]
Position: CEO
Traceback (most recent call last):
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/venv/bin/pv", line 33, in <module>
    sys.exit(load_entry_point('pv', 'console_scripts', 'pv')())
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/venv/lib/python3.6/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/venv/lib/python3.6/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/venv/lib/python3.6/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/venv/lib/python3.6/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/venv/lib/python3.6/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/venv/lib/python3.6/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/venv/lib/python3.6/site-packages/click/decorators.py", line 21, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/clients/commands.py", line 35, in create
    client_service.create_client(client)
TypeError: create_client() takes 1 positional argument but 2 were given

Así está clients/commands.py:

import click


from clients.services import ClientService
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 = ClientService(ctx.obj['clients_table'])

    client_service.create_client(client)


@clients.command()
@click.pass_context
def list(ctx):
    """List all clients"""
    pass

def update(ctx, client_uid):
    """Updates a client"""
    pass

def delete(ctx, client_uid):
    """Deletes a client"""
    pass

all = clients

El curso estubo excelente, hasta esta parte

Complicado estuvo por que en la primera parte del video no te dice que archivo esta abriendo.

Y luego de corregir muchos errores funciono.

Obtengo este error al tratar de llenar position una vez ejecutado el programa

TypeError: create_client() takes 1 positional argument but 2 were given

Como puede ser que no usen un IDE? dios.

Alguien se ha encontrado con este error?:

‘clients.commands’ has no attribute ‘all’

(venv) josevi4@CMP2DIRITPROC05:~/python-curso-CRUD/platzi_ventas$ pv clients create
Traceback (most recent call last):
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/venv/bin/pv", line 33, in <module>
    sys.exit(load_entry_point('pv', 'console_scripts', 'pv')())
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2693, in load_entry_point
    return ep.load()
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2324, in load
    return self.resolve()
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2330, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/home/josevi4/python-curso-CRUD/platzi_ventas/pv.py", line 19, in <module>
    cli.add_command(clients_commands.all)
AttributeError: module 'clients.commands' has no attribute 'all'

Este es el código de pv.py:

import click


from clients import commands as clients_commands


CLIENTS_TABLE = '.clients.csv'



@click.group()
@click.pass_context
def cli(ctx):
    ctx.obj = {}
    ctx.obj['clients_table'] = CLIENTS_TABLE



cli.add_command(clients_commands.all)

el equivalente de cat .clients.csv para windows es type, es decir, type .clients.csv

Yo usando Windows tuve varios errores para importar módulos de otros folder pero con estas sencillas líneas, quedó.

import click, sys

sys.path.insert(0, r"C:\Users\mival\OneDrive\Documentos\CRUD Python\clients")
import commands as clients_commands

CLIENTS_TABLE = '.clients.csv'
@click.group()
@click.pass_context
def cli(ctx):
    ctx.obj = {}
    ctx.obj['clients_table'] = CLIENTS_TABLE


cli.add_command(clients_commands.all)```

Tenemos el módulo @click.option(shortterm, longterm, type, prompt, help)

Pienso que esto es un curso donde vamos es aprender y tema que se toque , tema que se explica y no que requiera investigar por otro lado para poder entender al profesor. Las ultimas clases realmente desmejoraron mucho,.

Agregar decoradores a commands .py


@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.option('-u', '--uid',
                type = str,
                prompt = True,
                help = 'The client uid')

Este video se pasa escribiendo código sin explicar el por qué o sus funciones, personalmente me siento muy confundido. Debería tomarlo con mayor calma y explicar detalladamente como o hacia al principio de Curso

empieza click.option

Wowow cada vez hacemos cosas más chidas. Después de estar un poco atorado con algunos errores me di cuenta de que había implementado mal algunos decoradores. Cada vez voy entendiendo más los errores y eso también me alegra.
.
¡No han que rendirse!💪🏽

estupendo,

En lo personal excelente, muy buena clase

Alguien más tiene este inconveniente?

cat .clients.csv
<click.core.Context object at 0x7f8d47f84d30>,nombre,empresa,correo@gmail.com,Programmer
<click.core.Context object at 0x7f042f154d60>,nombre2,empresa,correo@gmail.com,Programmer

Cuando voy a ejectarlo me sale esto ,que debo o puedo hacer?

pv: create: No such file or directory
pv: clients: read failed: Is a directory
0.00 B 0:00:00 [0.00 B/s] [<=>

se podria ejecutar esto pero sin click? saludos cordiales