Domanda

sto usando Argparser per gestire gli argomenti per il mio CLI prog. Ma, come il tempo passato penso che non è una buona idea per usarlo. Qui viene il problema. Voglio usare le opzioni senza alcun carattere prefisso. Come git commit o spostare svn . Ho cercato un po 'e ha scoperto che Argparse ha un metodo add_subparser (). Cerchiamo di popolare il nostro pippo prog:

parser = argparse.ArgumentParser(prog='foo', usage='%(prog)s [options]')

subparsers = parser.add_subparsers(help='sub-command help')
parser_a = subparsers.add_parser('add', help='a help')
parser_a.add_argument('-ap', '--add-project',
                    nargs='*',
                    action='store',
                    help="Add project")

parser_d = subparsers.add_parser('del', help='a help')
parser_d.add_argument('-dp', '--delete-project',
                    nargs='*',
                    action='store',
                    help="Delete project")

args = parser.parser_args()

Ora lascia eseguire foo con opzioni e namespace di stampa args (non ho passato l'intero codice, si ottiene il punto):

$ ./foo del
Namespace(delete_project=None)
$ ./foo add
Namespace(add_project=None)

Come si vede, se eseguo l'opzione del, add_project non è passato al args variabile. Che causa problemi se ho un "se la clausola" nella mia funzione main () come

def main(args):

   if args.delete_project:
      ...
   if args.add_project:
      ...

io ottenere un AttributeError eccezione, che lo spazio dei nomi non ha alcun attributo con il nome di add_project se eseguo ./foo del. Oltre a questo, io non sono in grado di passare qualsiasi argomento alla del opzioni e add. Ho anche impostato prefix_chars su una stringa vuota, che non ha funzionato neanche.

Qual è il modo di gestire la cosa? È argparse in grado di creare opzioni come git, svn, ecc .. o forse dovrei creare la mia propria funzione e gestire tutti gli argomenti me stesso?

È stato utile?

Soluzione

Al posto della vostra, se le dichiarazioni, la documentazione argparse raccomandano qualcosa di simile :

parser_X.set_defaults(action=action_func)
args.action(args)

Poi l'add_action guarderà add_project, e del_action a del_project.

Altri suggerimenti

Modifica:. A quanto pare il valore predefinito per default è None, che significa che non hanno uno, quindi dovrete usare True e False (che è la strada giusta in ogni caso)

È necessario aggiungere il default quando si aggiunge la vostra discussione al parser:

parser_a.add_argument('-ap', '--add-project',
                    nargs = '*',
                    action = 'store_true',
                    default = False,
                    help = "Add project")

E 'possibile consultare la documentazione per il metodo add_argument qui . (Mi rendo conto che il layout argparse doc non è il più favorevole per capire come fare le cose che non sono chiamati dalle negli esempi)

Inoltre, come sottolinea giustamente Tobu nella sua risposta, le subparsers inutilizzati non ottenere invocato, quindi non è possibile sondare in modo sicuro i loro valori senza almeno proteggere il codice in un blocco try:. Tuttavia, in realtà si dovrebbe utilizzare la funzionalità di associare un action con i tuoi subparsers a meno che non si dispone di una situazione molto più complessa dove hanno bisogno di Stato Capitale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top