2017-01-23 8 views
1

Я пытаюсь создать сценарий, который принимает несколько аргументов командной строки одного типа, а затем передает их в цикл for для обработки, ниже - то, что у меня есть в моем коде:Использование значений parser_args для подачи цикла for (Python 3.6)

import argparse 

parser = argparse.ArgumentParser(description='XYZ') 
parser.add_argument('[values]', nargs='+', help='A list of values') 

u = parser.parse_args(['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']) 

for values in u: 
    ... # do a bunch of stuff for each "value" 

Я понимаю, что значения, хранящиеся в parse_args являются NAMESPACE, следовательно, ошибка ниже, когда я запускаю мой код:

TypeError: 'Namespace' object is not iterable 

есть ли способ, чтобы включить их в список объект? так что я могу передать их в мой цикл for, или есть ли другой подход, который я должен использовать? Просто начать работу с питоном, так извинениями заранее, если это нуб вопрос

+0

Какие значения вы хотите повторить? –

ответ

2

Вам нужно перебирать u.values (имя аргумента, указанные в add_argument вызове) не u сами; Для этого вам нужно переименовать [values] в values:

import argparse 

parser = argparse.ArgumentParser(description='XYZ') 
parser.add_argument('values', nargs='+', help='A list of values') 
#     ^^^^^^^^ 

u = parser.parse_args(['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']) 

for value in u.values: 
    #  ^^^^^^^^ 
    # do a bunch of stuff for each "value" 
+0

Замечание в случае, если кто-то другой приходит по этому вопросу, хотя вопрос отмечен как python3.x (и упоминается python3.6) это решение работает в python2.7 + –

0

Значение из разбора находятся в простом объекте класса argparse.namespace (которые могут быть настроены - смотрите документацию).

Обычно вы получаете доступ к этим значениям по имени атрибута, например. args.foo. Для необычных имен вам нужно использовать getattr(args, '[values]').

В простых аргументах аргумента аргумент представляет собой одну строку или номер. С nargs, например, '*' или '+', значения будут в списке. С типом действия append вы даже можете получать списки в списках.

Я призываю пользователей распечатать пространство имен args.

In [2]: parser = argparse.ArgumentParser(description='XYZ') 
    ...: parser.add_argument('[values]', nargs='+', help='A list of values').... 
In [3]: args =parser.parse_args(['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']) 

In [4]: print(args) 
Namespace([values]=['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']) 

С вашей «Dest» Я должен использовать getattr для извлечения списка строк из args.

In [5]: getattr(args,'[values]') 
Out[5]: ['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'] 

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

In [6]: args.values = ['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'] 
In [7]: print(args) 
Namespace([values]=['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'], 
    values=['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']) 

Если вы больше знакомы с словари, вы можете использовать vars():

In [9]: vars(args)['values'] 
Out[9]: ['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'] 

Поиграйте с такого рода вещи интерактивная сессия Python.