我可以将对象传递给 argparse.add_argument 吗?
Can I pass an object into argparse.add_argument?
而不是像这样在对 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 如何接受这些参数,无法理解它们是否可以像我想要的那样被抽象成某种对象文字。
有没有办法先把所有的参数抽象出来放到一个容器里,然后像上面那样通过一个循环一次把所有的参数都加进去?
很多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
。
要在同一个列表中同时获得 *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()
因此,元组的第一部分是另一个元组,包含参数的不同名称,然后(外部)元组的第二部分是带有关键字参数的字典。
而不是像这样在对 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 如何接受这些参数,无法理解它们是否可以像我想要的那样被抽象成某种对象文字。
有没有办法先把所有的参数抽象出来放到一个容器里,然后像上面那样通过一个循环一次把所有的参数都加进去?
很多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
。
要在同一个列表中同时获得 *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()
因此,元组的第一部分是另一个元组,包含参数的不同名称,然后(外部)元组的第二部分是带有关键字参数的字典。