2011-11-29 16 views
7

Używam argparse w Pythonie do analizowania argumentów wiersza poleceń:Python: Wyciąg zmiennych z przestrzeni nazw

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

Teraz chcę zrobić kilka obliczeń z a, b i c. Jednak uważam za nudne pisanie args.a + args.b + args.c przez cały czas.

Dlatego jestem wydobywania tych zmiennych:

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

taka, że ​​mogę napisać a + b + c.

Czy istnieje bardziej elegancki sposób robienia tego?

Ręczne wyciąganie staje się bardzo uciążliwe i podatne na błędy podczas dodawania wielu argumentów.

Odpowiedz

8

Jeśli chcesz je jako globalnych, można zrobić:

globals().update(vars(args)) 

Jeśli” re w funkcji i chcą je jako zmienne lokalne tej funkcji, można to zrobić w Pythonie 2.x następująco:

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. 

ta sztuczka nie działa w Pythonie 3, gdzie exec nie jest stwierdzenie, ani prawdopodobne w innych wersjach Pythona, takich jak Jython lub IronPython.

Ogólnie rzecz biorąc, polecam użycie krótszej nazwy dla obiektu args lub użycie schowka. :-)

+0

Dzięki za odpowiedź. Działa, ale część 'exec '" 'wydaje się bardzo brzydkim hackerem. Dlaczego to konieczne? – Lemming

+0

Korekta: Nie działa, jeśli funkcja zawiera funkcje zagnieżdżone. W tym przypadku pojawia się następujący komunikat o błędzie: 'exec" " Błąd składni: niekwalifikowany exec nie jest dozwolony w funkcji 'main' zawiera zagnieżdżoną funkcję z wolnymi zmiennymi' – Lemming

+0

Ick. Nie wiedziałem o tym, ale ma to sens. Zamknięcia wymagają standardowego mechanizmu zmiennej lokalnej Pythona, który uzyskuje dostęp do loci po indeksie. Użycie instrukcji 'exec' w dowolnym miejscu w funkcji zmusza Pythona do użycia alternatywnej metody dostępu do lokali po nazwie, ponieważ' exec' może definiować lub modyfikować locals (dlatego też możesz aktualizować 'locals()' jeśli 'exec 'jest widoczne w funkcji, ale nie inaczej). – kindall

0

Możesz dodać rzeczy do lokalnego zakresu, dzwoniąc pod numer locals(). Zwraca słownik reprezentujący aktualnie dostępny zakres. Można przypisać do niego, jak również - locals()['a'] = 12 spowoduje a będąc w zasięgu lokalnego o wartości 12.

+0

Nie powinieneś modyfikować zwracanej wartości 'locals()'. Nie ma gwarancji, że wywoła efekt i zwykle nie działa w CPython. http://docs.python.org/library/functions.html#locals –

+0

Wygląda na to, że to nie działa bez sztuczki "exec" ", o której wspomniałem. – Lemming

Powiązane problemy