Il Modulo ArgParse - Pt. 1

In questa nuova lezione introduciamo argparse, il modulo della standard library di Python dedicato e raccomandato per l'analisi di argomenti e opzioni passati tramite riga di comando.

Per questo scopo vedremo anche la funzione argv del modulo sys in una lezione dedicata.

import argparse

def calcolatrice(n1, n2, operazione):
    if operazione == "add":
        return n1 + n2
    elif operazione == "sot":
         return n1 - n2
    elif operazione == "mol":
        return n1 * n2
    elif operazione == "div":
        return n1 / n2

Per utilizzare il modulo, come di consueto anzitutto dobbiamo importarlo. Dobbiamo poi creare un oggetto di tipo Argument Parser, a cui poi andremo ad associare gli argomenti che vogliamo utilizzare.

parser = argparse.ArgumentParser(description="Semplice Calcolatrice per addizioni, sottrazioni, moltiplicazioni e divisioni")


Come aggiungere argomenti e assegnarli

Il nome parser è convenzionale, e tra le parentesi potete passare svariati parametri opzionali come descrizione, utilizzo ecc. Vi lascio qui un link alla Documentazione Ufficiale in cui potrete trovare l'elenco completo dei parametri che potete passare al vostro parser.

Quindi, analizziamo la nostra funzione calcolatrice: per farla funzionare correttamente abbiamo bisogno di due numeri n1 ed n2 e di una tipologia di operazione da svolgere. Dobbiamo quindi iniziare ad aggiungere argomenti al nostro parser, tramite il metodo add_argument(): tra le parentesi possiamo passare svariati parametri.

Per ora ci limiteremo al nome del parametro, alla tipologia (type) di parametro che ci aspettiamo (di default argparse tratta gli argomenti come stringhe), ed help a cui associamo una breve descrizione del parametro stesso.

parser.add_argument("n1", type=float, help="Primo Numero")
parser.add_argument("n2", type=float, help="Secondo Numero")
parser.add_argument("operazione", type=str, help="Operazione consentite: add | sot | mol | div")

Quindi una volta definiti gli argomenti che ci interessano, possiamo effettuare l'assegnazione vera e propria tramite il metodo parse_args(), in questo modo:

args = parser.parse_args()

Ottimo, ci siamo. A questo punto siamo pronti a richiamare la nostra calcolatrice con i nostri nuovi parametri!

risultato = calcolatrice(args.n1, args.n2, args.operazione)


Come utilizzare argparse tramite la shell di sistema

Andiamo subito nella shell di sistema e proviamo a richiamare lo script senza parametri e vediamo cosa otteniamo:

pymike@programmareinpython:~/Desktop/lezione_argparse$ python3.6 ./calc_argparse.py

# output
usage: calc_argparse.py [-h] n1 n2 operazione
calc_argparse.py: error: the following arguments are required: n1, n2, operazione

Otteniamo un errore in cui veniamo informati degli argomenti di cui abbiamo bisogno, n1, n2 e operazione: si tratta di un messaggio d'errore piuttosto utile, e notiamo anche che abbiamo un'opzione aggiuntiva, -h, abbreviativa di --help. Si tratta di una funzione di aiuto che otteniamo "for free", ovvero non dobbiamo preoccuparci di scriverla noi perché ci ha già pensato chi ha scritto il modulo argparse. Testiamola.

pymike@programmareinpython:~/Desktop/lezione_argparse$ python3.6 ./calc_argparse.py -h

# output
usage: calc_argparse.py [-h] n1 n2 operazione

Semplice calcolatrice per addizioni, sottrazioni, moltiplicazioni e divisioni

positional arguments:
    n1          Primo Numero
    n2          Secondo Numero
    operazione  Operazione consentite: add | sot | mol | div

optional arguments:
    -h, --help  show this help message and exit

Piuttosto piacevole da leggere non trovate? Proviamo però ora ad utilizzare la calcolatrice vera e propria:

pymike@programmareinpython:~/Desktop/lezione_argparse$ python3.6 ./calc_argparse.py 13 47 mol

# output
611.0

Per rendere la nostra calcolatrice un po' più robusta possiamo in verità restringere la scelta delle operazioni che è possibile effettuare a quelle che la nostra calcolatrice è in grado di processare, in questo modo:

parser.add_argument("operazione", type=str, help="Tipo di Operazione", choices = ["add", "sot", "mol", "div"])

E quindi:

pymike@programmareinpython:~/Desktop/lezione_argparse$ python3.6 ./calc_argparse.py --help

# output
usage: calc_argparse.py [-h] n1 n2 {add,sot,mol,div}

Semplice calcolatrice per addizioni, sottrazioni, moltiplicazioni e divisioni

positional arguments:
    n1                 Primo Numero
    n2                 Secondo Numero
    {add,sot,mol,div}  Tipo di Operazione

optional arguments:
    -h, --help         show this help message and exit

Provando a lanciare un comando che la calcolatrice non gestisce otteniamo un messaggio piuttosto utile:

pymike@programmareinpython:~/Desktop/lezione_argparse$ python3.6 ./calc_argparse.py 33 3 asd

# output
usage: calc_argparse.py [-h] n1 n2 {add,sot,mol,div}
calc_argparse.py: error: argument operazione: invalid choice: 'asd' (choose from 'add', 'sot', 'mol', 'div')

Come al solito, Happy Coding!