使用 parser_args 值来提供 for 循环 (Python 3.6)
Using parser_args values to feed a for loop (Python 3.6)
我正在尝试创建一个脚本,它接受多个相同类型的命令行参数,然后将它们送入 for 循环进行处理,以下是我的代码:
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,如果这是一个菜鸟问题,请提前致歉
您需要迭代 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"
解析的值在 class 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
是一个简单的对象,因此您可以添加属性或修改现有的属性。例如
In [6]: args.values = ['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']
In [7]: print(args)
Namespace([values]=['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'],
values=['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'])
如果你比较熟悉词典,可以使用vars()
:
In [9]: vars(args)['values']
Out[9]: ['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']
在交互式 Python 会话中玩这种东西。
我正在尝试创建一个脚本,它接受多个相同类型的命令行参数,然后将它们送入 for 循环进行处理,以下是我的代码:
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,如果这是一个菜鸟问题,请提前致歉
您需要迭代 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"
解析的值在 class 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
是一个简单的对象,因此您可以添加属性或修改现有的属性。例如
In [6]: args.values = ['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']
In [7]: print(args)
Namespace([values]=['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'],
values=['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'])
如果你比较熟悉词典,可以使用vars()
:
In [9]: vars(args)['values']
Out[9]: ['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']
在交互式 Python 会话中玩这种东西。