La maggior parte dei tool CLI fallisce come prodotto non perché la logica è sbagliata, ma perché l'interfaccia è un ripiego. Una CLI professionale si comporta in modo prevedibile: analizza gli argomenti con grazia, fallisce rumorosamente su stderr e restituisce exit code su cui uno script può fare affidamento.
Gli argomenti sono un problema di UX
Typer trasforma i type hint in un'interfaccia auto-documentata: testo di --help, validazione ed errori chiari arrivano gratis. Progetta i comandi come l'utente pensa al task, non come capita che siano organizzate le tue funzioni.
import typer
app = typer.App()
@app.command()
def scan(path: str, deep: bool = typer.Option(False, "--deep")):
"""Scansiona una cartella e riporta ciò che conta."""
...
if __name__ == "__main__":
app()Exit code e stderr sono la tua API
Gli script incatenano il tuo tool nelle pipeline. Tieni stdout pulito per l'output leggibile dalle macchine, manda la diagnostica su stderr e restituisci 0 solo quando il lavoro è davvero riuscito. Un tool che stampa stack trace su stdout rompe ogni pipeline che tocca.
Impacchetta una volta, gira ovunque
Distribuisci con un requirements.txt fissato alle versioni che hai davvero testato, e mantieni il punto di ingresso in un singolo main.py. Chi compra deve passare dal download al primo risultato in meno di un minuto — questo è lo standard di ogni asset PyForge.
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python main.py scan ./logs --deep