2011-11-29 10 views
7

sto usando argparse in Python per analizzare gli argomenti della riga di comando:Python: estrarre le variabili di spazio dei nomi

parser = ArgumentParser() 
parser.add_argument("--a") 
parser.add_argument("--b") 
parser.add_argument("--c") 
args = parser.parse_args() 

Ora voglio fare alcuni calcoli con a, b e c. Tuttavia, trovo faticoso scrivere sempre args.a + args.b + args.c.

Pertanto, sto estraendo quelle variabili:

a, b, c = [args.a, args.b, args.c] 

tale che posso scrivere a + b + c.

C'è un modo più elegante di fare questo?

estrazione manuale diventa molto noioso e soggetto ad errori quando si aggiungono molti argomenti.

risposta

8

Se li volete come globali, si può fare:

globals().update(vars(args)) 

Se si' re in una funzione e li vogliono come variabili locali di tale funzione, si può fare questo in Python 2.x come segue:

def foo(args): 
    locals().update(vars(args))  
    print a, b, c 
    return 
    exec "" # forces Python to use a dict for all local vars 
      # does not need to ever be executed! but assigning 
      # to locals() won't work otherwise. 

questo trucco non funziona in Python 3, dove exec non è una dichiarazione, né probabile in altre varianti di Python come Jython o IronPython.

Nel complesso, tuttavia, è consigliabile utilizzare solo un nome più breve per l'oggetto args o utilizzare gli Appunti. :-)

+0

Grazie per la risposta. Funziona, ma la parte "exec" "' sembra un brutto scherzo. Perché è necessario? Correzione – Lemming

+0

: non funziona se la funzione contiene funzioni annidate. In questo caso viene visualizzato il seguente messaggio di errore: 'exec" " SintassiErrore: exec non qualificato non è consentito nella funzione 'main' contiene una funzione nidificata con variabili libere' – Lemming

+0

Ick. Non lo sapevo, ma ha senso. Le chiusure richiedono il meccanismo delle variabili locali standard di Python, che accede ai locali per indice. L'uso dell'istruzione 'exec' ovunque in una funzione costringe Python ad usare un metodo alternativo per accedere ai locali per nome, perché' exec' potrebbe definire o modificare i locali (questo è anche il motivo per cui è possibile aggiornare 'locals()' if 'exec 'è visto nella funzione, ma non altrimenti). – kindall

0

È possibile aggiungere cose al ambito locale chiamando locals(). Restituisce un dizionario che rappresenta l'ambito attualmente disponibile. È possibile assegnare valori ad esso pure - locals()['a'] = 12 si tradurrà in a essere in ambito locale con un valore di 12.

+0

Non si dovrebbe modificare il valore di ritorno di 'locals()'. Non è garantito avere un effetto, e di solito non in CPython. http://docs.python.org/library/functions.html#locals –

+0

Sembra che questo non funzioni senza il trucco "exec" "', che kindall ha menzionato. – Lemming

Problemi correlati