2012-11-27 4 views
5

Attualmente, sto usando argparse per analizzare gli argomenti e memorizzare i flags come opzioni booleane. Quindi controllo per vedere quale flag è impostato su true ed eseguire quella funzione. Argparse analizza un file di input, che viene aperto e passato alla funzione chiamata come argomento.argparse chiama una funzione dopo aver analizzato altre opzioni

Quindi:

parser.add_argument('input_data', action='store', help='some help') 
parser.add_argument('outputname', action='store',default=None, help='some help') 
parser.add_argument('--flag','-f', action='store_true', dest='flag', default=False, help='help!') 

devo aprire l'input_data di leggere alcune informazioni da esso prima che la funzione di bandiera si chiama. Questo è attualmente implementato come:

if args.flag == True: 
    array_out = flag(array_read_from_input) 
    if args.outputname == None: 
     name = 'Flag.tif' 

E 'possibile subclass argparse di avere la parola chiave azione chiamare una funzione.

È possibile analizzare l'opzione input_data, eseguire alcune elaborazioni e quindi chiamare la funzione flag senza aver annidato i loop per ogni argomento, ad esempio sottoclasse il parametro di azione di argparse?

+0

Non confrontare oggetti con 'True' o' None'. O usate 'is' o usate il valore true dell'oggetto (quindi dovrebbe essere' if args.flag: ... 'e' se args.outputname è None'). Inoltre, sai che puoi creare azioni personalizzate giuste? Basta leggere la documentazione di argparse. – Bakuriu

+0

@Bakuriu "È possibile suddividere la sottoclasse di argparse in modo che la parola chiave action chiami una funzione." La domanda non è se sia possibile creare un'azione personalizzata, ma se tale azione può essere chiamata dopo aver analizzato e manipolato altri argomenti. – Jzl5325

+0

Se vuoi chiamarlo * dopo * l'analisi, allora non capisco quale sia la relazione di 'argparse' nella tua domanda. Quel modulo è lì solo per analizzare la riga di comando ed eventualmente eseguire azioni * durante * l'analisi. Inoltre, non capisco cosa c'è di sbagliato nel doppio 'if'. Come nota a margine: nulla vieta di usare una sottoclasse di [parser] (http://docs.python.org/dev/library/argparse.html#argumentparser-objects) e reimplemente 'parse_args' in modo che la funzione è chiamato lì, ma dovrai ancora mettere un doppio 'se' lì. – Bakuriu

risposta

0

E 'possibile analizzare l'opzione input_data, eseguire alcune di elaborazione, e quindi chiamare la funzione bandiera senza aver nidificato se anelli per ogni argomento, ad esempio., Da sottoclasse azione parametro di argparse ?

Secondo la vostra domanda;

class FooAction(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string=None): 
     << some processing of values >> 
     array_out = flag(values) 
     setattr(namespace, self.dest, array_out) 

parser = argparse.ArgumentParser() 
parser.add_argument('input_data', action=FooAction, help='some help')