Подтвердить что ты не робот

Как перебирать аргументы

У меня есть script:

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

So

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

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

Ответ 3

После

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.

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

Ответ 4

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

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

Ответ 5

Анализ синтаксического анализа вашего парсера кажется неплохой идеей. Вместо запуска 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" как "выбор", например, если вам нужны предустановленные значения по умолчанию для параметра в другом script (например, путем возврата параметров в функцию).

Ответ 6

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., Что означает, что вам не нужно перебирать эти аргументы.