使用parser_args值来提供一个for循环(Python 3.6)
我想创建一个脚本,它需要多个相同类型的命令行参数,然后将它们提供给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问题,请提前道歉
您需要迭代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"
如果有其他人出现这个问题,请注意,虽然问题标记为python3.x(并提及python3.6),但此解决方案在python2.7 + –
从解析值是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
是一个简单的对象,这样你就可以添加属性或修改现有的。例如周围这样的事情一个交互式的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()
。
你想迭代什么类型的值? –