2017-01-23 76 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的值是一个命名空间,因此,当我跑我的代码如下错误:

TypeError: 'Namespace' object is not iterable 

有没有办法把它们放入一个列表目的?以便我可以将它们传递给我的for循环,或者是否有其他方法可以使用?刚开始使用python,如果这是一个noob问题,请提前道歉

+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”我必须使用getattrargs获取字符串列表。

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

args是一个简单的对象,这样你就可以添加属性或修改现有的。例如周围这样的事情一个交互式的Python会话

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

播放:

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

如果你比较熟悉的字典,您可以使用vars()