2014-11-28 1 views
26

У меня есть такой скрипт:Как перебрать аргументы

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) 

Но он не работает. Я получаю ошибку:

TypeError: 'Namespace' object is not iterable 

Как перебирать аргументы и их значение?

ответ

39

Пожалуйста, добавьте «вары», если вы хотите итерацию над объектом пространства имен:

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

Namespace объекты не итерацию, стандартные документы предлагают делать следующее, если вы хотите, словарь:

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

Так

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

Честно говоря, я не знаю, почему вы хотите перебирать аргументы. Это несколько поражает цель использования парсера аргументов.

+0

типичное использование для этого реализует режим 'debug-input', где скрипт выводит все входные аргументы и выходы; полезно для таких вещей, как проверка правильности ввода значений входных данных datetime. –

0

ArgumentParser.parse_args возвращает Namespace объект вместо итератора массивов.

Для справки 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. 

И он не должен быть использован, как это. Рассмотрите ваш прецедент, в документе, он говорит, что argparse будет определять, как разбирать их из sys.argv., что означает, что вам не нужно перебирать эти аргументы.

6

После

args = parser.parse_args() 

, чтобы отобразить аргументы, использование:

print args # or print(args) in python3 

args объекта (типа argparse.Namespace) не итерация (т.е. не список), но она имеет .__str__ метод, который хорошо отображает значения.

args.out и args.type укажите значения двух аргументов, которые вы определили. Это работает большую часть времени. getattr(args, key) самый общий способ доступа к значениям, но обычно не нужен.

vars(args) 

превращает пространство имен в словарь, к которому вы можете получить доступ со всеми методами словаря. Это указано в docs.

исх: пространство имен пункт из документации - https://docs.python.org/2/library/argparse.html#the-namespace-object

+0

Спасибо за хорошую запись! – Hua2308

1

Я использую args.__dict__, который позволяет получить доступ к лежащей в основе структуры Dict. Затем его простой ключ-значение итерации:

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

Разбор _actions из вашего парсера кажется достойной идеей. Вместо запуска parse_args(), а затем пытается выбрать материал из вашего пространства имен.

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')) 

Вы можете изменить «Dest» часть, чтобы быть «выбор», например, если вам необходимо предварительно установленные значения по умолчанию для параметра в другом сценарии (возвращая параметры в функции, например).

Смежные вопросы