而不是在add_argument
的调用中散布一堆文字,如下所示:
parser.add_argument('--foo',
required=False,
metavar='bar',
type=str,
help='help message',
default='default')
parser.add_argument('--foo2',
required=False,
metavar='bar2',
type=str,
help='help message',
default='default')
我希望我可以先创建一个容器,然后在循环中添加所有参数 像这样:
for arg in argument_container:
parser.add_argument(arg)
我不太熟悉python如何接受这些参数来理解它们是否可以像我想要的那样被抽象为某种对象文字。
有没有办法首先将所有参数抽象到容器中,然后通过循环一次性添加所有参数,如上所示?
答案 0 :(得分:2)
要在同一列表中同时获取*args
和**kwargs
,您可以将它们添加为元组的一部分:
import argparse
parser = argparse.ArgumentParser(description='Process some strings.')
args = [(('--foo', '-f'), {'help':'Foo help', 'required':False, 'type':str, 'default':'foo'}),
(('--bar', '-b'), {'help':'Bar help', 'required':False, 'type':str, 'default':'bar'})]
for arg in args:
parser.add_argument(*arg[0], **arg[1])
parsed_args = parser.parse_args()
因此,元组的第一部分是另一个元组,包含参数的不同名称,然后(外部)元组的第二部分是带有关键字参数的字典。
答案 1 :(得分:1)
许多add_argument
参数都是关键字,可以通过**kwargs
语法传递。例如:
In [90]: parser=argparse.ArgumentParser()
In [91]: adict={"metavar":"bar", "help":"help message", "default":"default"}
In [92]: a1 = parser.add_argument('--foo', **adict)
In [93]: a1
Out[93]: _StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default='default', type=None, choices=None, help='help message', metavar='bar')
In [94]: parser.print_help()
usage: ipython3 [-h] [--foo bar]
optional arguments:
-h, --help show this help message and exit
--foo bar help message
在这里,我创建了一个包含一些参数的小字典,并通过**adict
传递了这些参数。
我没有在该字典中包含'--foo',因为它是一个位置参数。那仍然可以分配给变量,并以这种方式传递。
我保存了对add_argument
返回的对象的引用,并显示了该引用。它显示了大多数参数如何成为生成的Action
对象的属性。
对于你的第二个论点:
In [95]: dest = "--foo2"
In [96]: adict={"metavar":"bar2", "help":"help message2", "default":"default2"}
In [97]: a2 = parser.add_argument(dest, **adict)
In [98]:
In [98]: parser.print_help()
usage: ipython3 [-h] [--foo bar] [--foo2 bar2]
optional arguments:
-h, --help show this help message and exit
--foo bar help message
--foo2 bar2 help message2
显然,这可以推广到使用字典列表,或者使用带有一些参数的函数,生成缺失的函数并以这种方式调用add_argument
。