2014-11-28 24 views
26

mam taki skrypt:Jak iteracyjne nad argumentów

import argparse 

parser = argparse.ArgumentParser(
       description='Text file conversion.' 
       ) 
parser.add_argument("inputfile", help="file to process", type=str) 
parser.add_argument("-o", "--out", default="output.txt", 
        help="output name") 
parser.add_argument("-t", "--type", default="detailed", 
        help="Type of processing") 

args = parser.parse_args() 

for arg in args: 
    print(arg) 

Ale nie robi praca. Otrzymuję komunikat o błędzie:

TypeError: 'Namespace' object is not iterable 

Jak powtórzyć argumenty i ich wartość?

Odpowiedz

39

proszę dodać „vars” jeśli chcesz iteracyjne nad obiektu przestrzeni nazw:

for arg in vars(args): 
    print arg, getattr(args, arg) 
13

Namespace obiekty nie są iterable standardowe docs sugerują, wykonując następujące czynności, jeśli chcesz słownika:

>>> vars(args) 
{'foo': 'BAR'} 

Więc

for key,value in vars(args).iteritems(): 
    # do stuff 

Szczerze mówiąc nie jestem pewien, dlaczego chcesz powtarzać argumenty. To nieco pokonuje cel posiadania parsera argumentów.

+0

typowym zastosowaniem jest implementacja trybu 'debug-input', w którym skrypt wypisuje wszystkie argumenty wejściowe i kończy działanie; przydatne dla takich rzeczy jak upewnienie się, że wartości wejściowe datetime zostały poprawnie zinterpretowane –

0

ArgumentParser.parse_args zwraca Namespace obiekt zamiast iterowalny tablic.

celach informacyjnych, https://docs.python.org/3/library/argparse.html#parsing-arguments

ArgumentParser parses arguments through the parse_args() method. This will inspect the command line, convert each argument to the appropriate type and then invoke the appropriate action. 

I to nie ma być używane w taki sposób. Rozważ swój przypadek użycia w dokumencie, który mówi, że argparse wymyśli, jak je przeanalizować z poziomu sys.argv., co oznacza, że ​​nie musisz powtarzać tych argumentów.

6

Po

args = parser.parse_args() 

wyświetlać argumentów, zastosowanie:

print args # or print(args) in python3 

args przedmiot (typu argparse.Namespace) nie jest iterable (czyli nie jest lista), ale ma .__str__ metoda, która ładnie wyświetla wartości.

args.out i args.type podać wartości dwóch zdefiniowanych przez Ciebie argumentów. Działa to przez większość czasu. getattr(args, key) najbardziej ogólny sposób uzyskiwania dostępu do wartości, ale zazwyczaj nie jest potrzebny.

vars(args) 

przekształca przestrzeń nazw w słownik, do którego można uzyskać dostęp za pomocą wszystkich metod słownikowych. Jest to opisane w docs.

ref: Przestrzeń nazw akapit docs - https://docs.python.org/2/library/argparse.html#the-namespace-object

+0

Dzięki za miłe spisać! – Hua2308

1

Używam args.__dict__, który umożliwia dostęp do dolnej konstrukcji dict. Następnie jego prosty klucz-wartość iteracja:

for k in args.__dict__: 
    print k, args.__dict__[k] 
1

parsowania _actions z parsera wydaje się przyzwoity pomysł. Zamiast uruchamiać funkcję parse_args(), a następnie próbować wybierać rzeczy z przestrzeni nazw.

import argparse 

parser = argparse.ArgumentParser(
       description='Text file conversion.') 
parser.add_argument("inputfile", help="file to process", type=str) 
parser.add_argument("-o", "--out", default="output.txt", 
       help="output name") 
parser.add_argument("-t", "--type", default="detailed", 
       help="Type of processing") 
options = parser._actions 
for k in options: 
    print(getattr(k, 'dest'), getattr(k, 'default')) 

Można modyfikować „dest” części za „wybory” na przykład, jeśli chcesz zaprogramowanych wartości domyślne dla parametru w innym skrypcie (powracając do opcji w zależności na przykład).

Powiązane problemy