【问题标题】:Can I pass an object into argparse.add_argument?我可以将对象传递给 argparse.add_argument 吗?
【发布时间】:2017-10-09 13:06:07
【问题描述】:

而不是将一堆文字分散在对 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 的实现,但我仍然不确定函数可以接受什么。

标签: python object parameter-passing argparse


【解决方案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 的函数。

【讨论】:

  • 谢谢。传入字典时我没有**ing。
【解决方案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()

因此,元组的第一部分是另一个元组,包含不同的参数名称,然后(外部)元组的第二部分是带有关键字参数的字典。

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多