Ответ 1
Пожалуйста, добавьте "vars", если вы хотите перебирать объект пространства имен:
for arg in vars(args):
print arg, getattr(args, arg)
У меня есть 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
Как перебирать аргументы и их значение?
Пожалуйста, добавьте "vars", если вы хотите перебирать объект пространства имен:
for arg in vars(args):
print arg, getattr(args, arg)
Namespace
объекты не повторяются, стандартные документы предлагают сделать следующее, если вы хотите использовать словарь:
>>> vars(args)
{'foo': 'BAR'}
So
for key,value in vars(args).iteritems():
# do stuff
Честно говоря, я не уверен, почему вы хотите перебирать аргументы. Это несколько поражает цель использования парсера аргументов.
После
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
Я использую args.__dict__
, который позволяет вам получить доступ к базовой структуре dict.
Затем его простая итерация ключевого значения:
for k in args.__dict__:
print k, args.__dict__[k]
Анализ синтаксического анализа вашего парсера кажется неплохой идеей. Вместо запуска 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 (например, путем возврата параметров в функцию).
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
., Что означает, что вам не нужно перебирать эти аргументы.