Búsqueda de sitios web

Tutorial de Python Typer: cree CLI con Python en minutos


Aprenda a crear CLI con Python usando Typer en unos sencillos pasos.

En este tutorial, crearemos una interfaz de línea de comandos (CLI) utilizando Typer, una biblioteca de Python que hace que la creación de CLI sea rápida y sencilla. Typer también aprovecha las sugerencias de tipo de Python.

Este tutorial le mostrará cómo crear una CLI para un rastreador de programación. Específicamente, aprenderemos cómo:

  • Configurar Typer
  • Agregar comandos
  • Maneje la tarea, el tiempo y la prioridad: tipos de entrada y datos correctamente

¡Empecemos!

Paso 1: instalar Typer

Primero, instalemos Typer:

$ pip3 install typer

La instalación de Typer instala automáticamente todas las dependencias requeridas, lo que facilita la funcionalidad de la interfaz de línea de comandos. Instale Typer en un entorno virtual para el proyecto.

Aquí está el repositorio de GitHub para este sencillo proyecto.

Paso 2: cree la CLI básica

Comencemos creando una CLI simple que pueda agregar una tarea a una programación con el formato de hora correcto.

Cree un archivo Python llamado schedule_tracker.py.

Importe las bibliotecas y módulos necesarios. La instancia typer.Typer() (app) administra los comandos CLI.

import typer
from datetime import datetime
import json
from typing import List

app = typer.Typer()

Definimos algunas funciones auxiliares para cargar el programa y guardarlo en un archivo JSON:

SCHEDULE_FILE = "schedule.json"

def load_schedule() -> List[dict]:
    try:
        with open(SCHEDULE_FILE, "r") as f:
            return json.load(f)
    except (FileNotFoundError, json.JSONDecodeError):
        return []

def save_schedule(schedule: List[dict]):
    with open(SCHEDULE_FILE, "w") as f:
        json.dump(schedule, f, default=str, indent=4)

Debido a que tenemos un tiempo asociado con cada tarea, creemos una función auxiliar que analice la cadena en un objeto de tiempo válido:

def parse_time(t: str) -> datetime.time:
    try:
        return datetime.strptime(t, "%H:%M").time()
    except ValueError:
        typer.echo("Invalid time format. Please use HH:MM.")
        raise typer.Exit()

Cree el comando básico add_task. La tarea (una descripción de la tarea), el tiempo y la prioridad definen cada elemento de la tarea:

@app.command()
def add_task(
	task: str,
	time: str = typer.Option(..., help="Time in HH:MM format"),
	priority: int = typer.Option(1, help="Priority of the task")
):
    schedule = load_schedule()
    task_time = parse_time(time)
    schedule.append({"task": task, "time": task_time.strftime("%H:%M"), "priority": priority})
    save_schedule(schedule)
    typer.echo(f"Task '{task}' added at {task_time.strftime('%H:%M')} with priority {priority}")

if __name__ == "__main__":
	app()

Paso 3: ejecute la CLI

Ahora ejecute schedule_tracker.py para agregar tareas como esta:

$ python3 schedule_tracker.py add-task "Team meeting" --time "14:00" --priority 2

Qué salidas:

Task 'Team meeting' added at 14:00 with priority 2

¡Ahora tiene una CLI funcional que acepta tareas con tiempo y prioridad asociados!

Paso 4: agregue más comandos

Agreguemos más funciones a nuestro rastreador de programación, como ver y eliminar tareas.

Primero, agregue un comando para ver las tareas ordenadas por tiempo:

@app.command()
def list_tasks():
    """List all scheduled tasks."""
    schedule = load_schedule()
    if not schedule:
        typer.echo("No tasks found.")
        return
    for task in sorted(schedule, key=lambda x: x["time"]):
        @app.command()
        print(f"Task {i}: {task['task']}")
        print(f"  Time: {task['time']}")
        print(f"  Priority: {task['priority']}")
        print("-" * 40)  # Add a separator line for better readability

También puede modificar esta función según sea necesario para ordenar las tareas por prioridad.

Agreguemos también un comando para eliminar tareas por su número de índice:

@appcommand()
def remove_task(task_number: int):
    """Remove a task by its number."""
    schedule = load_schedule()
    if 0 < task_number <= len(schedule):
        removed_task = schedule.pop(task_number - 1)
        save_schedule(schedule)  # Save the updated schedule
        typer.echo(f"Removed task '{removed_task['task']}' scheduled at {removed_task['time']}") 
    else: 
        typer.echo(f"Invalid task number. Choose a number between 1 and {len(schedule)}.")

Paso 5: Pruebe la CLI mejorada

Ahora, pruebe los siguientes comandos.

Agregue múltiples tareas:

$ python3 schedule_tracker.py add-task "Code review" --time "10:30" --priority 1
$ python3 schedule_tracker.py add-task "Client meeting" --time "12:00" --priority 3

Al hacerlo, verá:

Task 'Code review' added at 10:30 with priority 1
Task 'Client meeting' added at 12:00 with priority 3

Ver todas las tareas:

$ python3 schedule_tracker.py list-tasks

Al ejecutar este comando se genera:

Task 0: Code review
  Time: 10:30
  Priority: 1
----------------------------------------
Task 1: Client meeting
  Time: 12:00
  Priority: 3
----------------------------------------
Task 2: Team meeting
  Time: 14:00
  Priority: 2
----------------------------------------

Eliminar una tarea:

$ python3 schedule_tracker.py remove-task 1

Esto produce:

Removed task 'Team meeting' scheduled at 14:00

Ver la lista de tareas actualizada:

$ python3 schedule_tracker.py list-tasks

Ahora deberíamos ver el siguiente resultado:

Task 0: Code review
  Time: 10:30
  Priority: 1
----------------------------------------
Task 1: Client meeting
  Time: 12:00
  Priority: 3
----------------------------------------

Concluyendo

Eso es todo por este tutorial. Como se ve, con Typer, puede crear CLI simples pero potentes en solo minutos. En este tutorial, creamos un rastreador de programación que maneja tareas y validación de entrada de tiempo de manera eficiente.

Ahora puede mejorar la versión que hemos creado. Puede ampliar este proyecto agregando más funciones como tareas recurrentes, recordatorios o exportando el cronograma. O puede intentar crear una aplicación similar para realizar un seguimiento de los gastos.

¡Feliz codificación!