关于python:如何迭代参数

How to iterate over arguments

我有这样的剧本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)

但它不起作用。我得到错误:

1
TypeError: 'Namespace' object is not iterable

如何迭代参数及其值?


如果要在命名空间对象上迭代,请添加"vars":

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

Namespace对象不可初始化,如果您需要字典,标准文档建议您执行以下操作:

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

所以

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

老实说,我不知道你为什么要重复这些论点。这在一定程度上破坏了使用参数解析器的目的。


1
args = parser.parse_args()

要显示参数,请使用:

1
print args # or print(args) in python3

args对象(类型为argparse.Namespace的)不可重写(即不是列表),但它有一个.__str__方法,可以很好地显示值。

args.outargs.type给出了您定义的2个参数的值。这在大多数时候都有效。getattr(args, key)是访问值的最一般的方法,但通常不需要。

1
vars(args)

将命名空间转换为字典,您可以使用所有字典方法访问它。这在docs中有详细说明。

参考:文档的命名空间段落-https://docs.python.org/2/library/argparse.html命名空间对象


我使用的是args.__dict__,它允许您访问底层的dict结构。然后,它是一个简单的键值迭代:

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

从您的解析器解析操作似乎是一个不错的主意。而不是运行parse_args(),然后尝试从名称空间中挑选内容。

1
2
3
4
5
6
7
8
9
10
11
12
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"部分修改为"choices",例如,如果您需要另一个脚本中某个参数的预设默认值(例如,通过返回函数中的选项)。


ArgumentParser.parse_args返回一个Namespace对象,而不是一个iterable数组。

供参考,https://docs.python.org/3/library/argparse.html解析参数

1
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中的那些内容,这意味着您不必重复这些参数。